2014-11-21 106 views
0

我有兩個表結構如下MySQL的關係問題

person (id, fname, lname, ph, mob, dob, email) 
address (id, address1, address2, address3, town, county, postcode) 
person_address (id, person_id, address_id) 

我在這裏有一個問題,如果一個人有多個地址如何將我的工作哪些是積極的還是當前地址,應我添加地址表的直接聯繫,如person (id, fname, lname, ph, mob, dob, email, address_id)

或者我應該添加一個鏈接到person_address鏈接到人表person (id, fname, lname, ph, mob, dob, email, person_address_id)

任何想法

回答

2

據推測,一個人只能有一個當前地址。如果是這樣,您應該在person表中添加一列,名爲CurrentAddress

如果您需要需要當前地址,您甚至可以聲明CurrentAddressNOT NULL

如果一個人可以有多個當前地址,則使用person_address中的標誌。

現在,如果您希望當前地址是最近插入的地址,則可以使用觸發器重置每個插入的值。或者,如果您的數據庫不是太大(數千行,而不是數百萬行),您可以通過選擇具有最近創建時間的person_address記錄進行即時計算。

編輯:

@ Joanvo的觀點是一個很好的點。您可以通過在person中添加外鍵約束來修復它,請參閱person_address。您將不得不在current_address(person_id, address_id)上創建一個唯一約束,並將其用於外鍵。

+0

我喜歡給person_address添加一個標誌的想法。這個唯一的缺點就是如果使用ORM,向關係表添加屬性並不重要。最後,我不得不爲豐富的關係創建一個新模型。 – amenadiel 2014-11-21 12:53:28

+1

這種方法會給你必須檢查一致性的問題,你必須保證當前地址中的外鍵存在於person_address表中。 – Joanvo 2014-11-21 12:56:40

+0

@Joanvo。 。您可以添加一個外鍵約束,這不是問題。我編輯了答案。 – 2014-11-21 13:09:31

2

您應該在person_address表中添加一點以表明它是否爲當前地址。確保有通過SQL或代碼檢查不超過一個當前地址:

person_address (id, person_id, address_id, current) 
1

如果添加person_address表的引用到表,將person_address之間創建一個圓形扶養和表,因爲person_address表已經封裝了對表的引用。在處理數據庫設計時你絕對不應該這樣做。 現在,如果你想要一個乾淨的設計,我會建議你參考地址表到人員表,就像你在第一個例子中做的那樣。所以,你的設計方案會像如下:

person (id, fname, lname, ph, mob, dob, email, address_id) 

編輯:

還是一個解決方案將是一個current_flagperson_adress表,所以,當你想擁有的當前地址一個人,你將搜索person_adress條目,該條目的current_flag設置爲1。

person_address (id, person_id, address_id, current_flag)