2014-05-07 33 views
0

我有兩種「用戶」的一般類型,PersonPage。他們可以執行相同的操作(投票,評論,發帖等),但它們具有本質上不同的信息。簡而言之,Person具有first_name,last_name,genderbirthday。 A Page有一個title,descriptionbasic_info如何用兩用外鍵重構數據庫架構

人都和頁面可以在整個系統進行相同動作,所以在設計數據庫模式的時候,我覺得有必要涉及一切回到中央id列。否則,我認爲系統的複雜性會急劇增加(雖然也許我說這是不正確的)。

鑑於此,我希望有一個「映射」表。例如,我們稱這個表MapMap有一個id(所有標識的中心標識),destination_id(個人或頁面的標識,取決於下一列...)和type(個人或頁面)。

例如,如果type是「Person」,我知道要查看User表,並且如果type是「Page」,我知道要查看Page表以獲取必要的信息。

我對此設計不滿意,因爲它引入了「雙用途外鍵」。 - 我在Map表中有一個「外鍵」,它可以引用任意數量的其他表。

如何重構,這樣我可以:

  1. 最好,允許添加額外的user_types(人員,信息頁,然後組,例如)
  2. 擺脫雙的目的外鍵

另一種可能:已在Map表兩列,page_idperson_id,這兩者都是實際的外鍵,但其中只有一個不爲空。無論哪個不是null顯然都是正確的user_type信息(Page或Person)的真正外鍵。

這似乎是中等合理的,但它並不一定滿足我的第一個條件,因爲我喜歡「乾淨」,而且它看起來相當笨拙。

我該如何重構這個?

+0

頁面是用戶? – attila

+0

可以將頁面視爲用戶。我會編輯,希望更清晰。 – JohnZ

回答

1

我會刪除映射表,將Type列移到User表中,並在Person和Page表上引用用戶表上的主鍵的外鍵列。