2009-08-31 57 views
0

我正在處理具有每個用戶類型派生自的現有個人表的數據庫。換句話說,有喜歡的表:
Individual: FirstName, LastName, Email, <lots more>
員工:IndividualId
客戶:IndividualId
跨表共享一個「身份」

現在,我要添加新的用戶類型(WeirdPerson)不從派生個人。 (WeirdPerson與其相關的數據明顯少於任何個人,而且我真的不希望幾乎將個體中的每個字段都設置爲WeirdPerson的空值。)

我需要一個關鍵字段用於表來自WeirdPersons的條目和來自個人的條目。這表明映射表如下所示:
MashedupIndividuals: MashedupId, IndividualId
MashedupWeirdPerson: MashedupId, WeirdPersonId

我想MashedupId是自動生成的場。由於我使用的是TSQL,因此身份似乎是一個不錯的選擇。除了MashedupId分爲兩個表格。我考慮過另外一張表:
MashedupIds: MashedupId
設置MashedupId爲一個標識,然後在MashedupIndividuals和MashedupWeirdPerson中將其設置爲外鍵。

這是繼續前進的最佳方式嗎?你會如何解決這個問題?

編輯:爲了澄清,我有一個WeirdPerson的唯一信息是一個電子郵件地址。我考慮將個人電子郵件字段拉出來,然後用GlobalPersonId和Email創建一個新的GlobalPerson表。 GlobalPerson表格(或者我使用的任何更好的名字)並不像將WeirdPerson分離成完全不同的類型那樣自然。但是......我願意重新考慮這一立場。

+0

我想我從未見過沒有名字或姓氏的人。這些奇怪的人究竟是什麼? – jmucchiello 2009-08-31 17:16:23

+0

我編輯了我的問題來解決WeirdPerson的奇怪問題。我想我可以逃脫而不給他們更多的信息。我顯然是錯的。 :) – Eric 2009-08-31 17:28:24

回答

2

我會建議一個表來託管應用程序中所有人共用的數據。然後,您可以爲特定類型的人添加額外的表格並將其鏈接回公共表格。

tblPerson

  • 是PersonID(PK)
  • 姓名,地址,生日等

tblEmployee

  • 僱員(PK)
  • 是PersonID(FK到tblPerson)
  • 標題,OfficePhone,電子郵件等

tblCustomer

  • 客戶ID(PK)
  • 是PersonID(FK到tblPerson)
  • 其他領域...

編輯:

這裏有一些定義更適用於你的問題(也更加有趣,這些怪異的人PLE)。關鍵是建立奇怪的人和普通人共享的數據,然後建立表/關係來支持該模型。可能有必要將不適用於怪異人員的領域從tblIndividual轉移到tblNormalPerson。

tblIndividual

  • IndividualID(PK)
  • 了適用於這兩個怪異/正常人

tblWeirdPerson

  • WeirdPersonID(PK)
  • IndividualID數據的其他領域(fk到tblIndividual)
  • NumberOfHeads(適用於怪異的人)

tblNormalPerson

  • NormalPersonID(PK)
  • IndividualID(FK到tblIndividual)
  • 姓(其它領域適用於正常的人)
  • 姓氏
  • 等等......
+0

實際上,db已經包含這樣的設置。問題是WeirdPerson不適合我的個人表。 – Eric 2009-08-31 17:10:17

+1

我認爲他的意思是,如果你有一個「不是」一個人的WeirdPerson類,你顯然沒有基礎班級。你可以有tirdlerson,WeirdPerson等從中派生出來,tblDetailPerson,這是「正常」人從中派生出來的。我認爲這就是mmayo的目標。 – 2009-08-31 17:13:07

+0

然後,你需要更具體地說明這些人怪異的原因。他們沒有名字或地址?或者人臉表格有更多不適用的字段? – jmucchiello 2009-08-31 17:14:53

0

你可以有一個表有三個字段,其中一個總是空:

MashedupId,IndividualId,WeirdPersonId

或與ID字段和ID類型(個人/怪異)

+0

是的,我也這麼認爲。但總的來說,我不是這種解決方案的粉絲。查詢一個人是什麼類型很困難,而且每一行中的NULL都會刺激我。 – Eric 2009-08-31 17:07:34

+0

您可以在個人(共享)的「上方」使用共享ID和電子郵件(將電子郵件字段移出個人)。然後你的mashup表只有mashedupID和sharedID。 – Beth 2009-08-31 19:42:27

1

您可以使用uniqueidentifier字段作爲您的ID。這保證在多個表中是唯一的。使用NEWID()函數生成新值。

+0

+1:只需一次調整:對所有表使用單個SEQUENCE。 – ATorras 2009-08-31 17:11:00