使用下面的表佈局:數據完整性和限制
TABLE Something
(
SomethingId
Name
DateCreated
IsObsolete ('Y','N')
PRIMARY KEY (SomethingId)
Foreign Key (SomethingTypeCode)
;
TABLE SomethingType
(
SomethingTypeCode ('1','2','3')
Description
PRIMARY KEY (SomethingTypeCode)
);
隨着PHP/MySQL的設置是有一些方法,我可以通過一個約束或索引,對於每個SomethingTypeCode限制(1,2,3)在Something表中標識,只能有一個IsObsolete = N與它關聯?
我希望能解釋我正在努力完成的事情。我只是不知道該如何解決這個問題。我希望數據完整性能夠在數據庫本身中儘可能地保持,然後將其擴展到PHP。
編輯:
在回答我與VoteyDisciple答案越來越混亂。
EmailTypeCode:P =個人,B =商務,S =學校
這裏是我的設計:
這將允許一個人有多於一個類型的電子郵件在一個給定的typecode(即2個業務電子郵件),並避免數據庫中的重複,不需要任何空值。由於我只關心在每個類別(系統將使用的那個)中有一個活動電子郵件,這是IsObsolete發揮作用的地方。我可以保留歷史記錄,避免重複,避免空值,並確保在此輸入系統的唯一電子郵件地址。
當然這也帶來了我原來的問題所述的問題。
VoteyDisciple的做法
VoteyDisciple請讓我知道,如果我把它描述錯誤(或正確的)。
「如果只能有一個給定類型」 - 只有一個活躍的不是時候,不僅是在系統中。
「現在ActiveId可以是NULL」 - 我強調了我不希望NULLs
「或它可以指向特定的某事記錄。」該類型定義記錄。
在我上面的回覆之上,這似乎在任何查詢中增加了復原複雜性。我的回答是基於我對你所呈現的內容的理解。我們要麼不瞭解彼此,要麼只是在我的最後。我很感激你的意見,但是我認爲這不是一個可行的解決方案。
感謝您的回覆。直到後期才能深入研究。使用MySQL,因爲你只能定義一個Trigger動作,所以我將不得不選擇動作(插入或更新)並將我可以進入的內容打包,對嗎?現在,這主要影響InnoDB表,雖然有些可能需要更改並且有可能被更改。 – enfield 2011-05-13 22:10:42
@enfield是的,你是對的,你需要將你的所有規則打包到一個或其他觸發器中,InnoDB你可以避免死鎖,所以鎖定你不更新或使用後的行更新觸發器。另外(雖然我不完全確定它),但您可能還需要確保在同一個更新語句中不更新多個相同類型的項目。 – Neel 2011-05-16 08:43:32