我準備一個傳統的Microsoft SQL Server數據庫,以便我可以通過一個ORM,如實體框架接口,我的問題圍繞處理一些我的多對多關聯有共同的類型。具體來說,是否應該在主類型之間共享一個通用類型,還是每個主類型都有自己的鏈接表?設置多對多表共享一個共同的類型
例如,下面是一個簡單的例子,我炮製,顯示感興趣的表如何目前設置:
注意的有兩種類型,Teachers
和Students
,都可以包含零,一個或多個PhoneNumbers
。兩個表Teachers
和Students
實際上共享關聯表(PeoplePhoneNumbers
)。字段FKID
可以是TeacherId
或StudentId
。
我認爲這應該是設置的方法是這樣的:
這樣一來,無論是Teachers
表和Students
表獲得自己的PHONENUMBERS表。
我的直覺告訴我第二種方式是正確的。這是真的?即使PhoneNumbers表包含多個字段,該怎麼辦?我面向對象的程序員的大腦告訴我,如果這些表的唯一區別是它們鏈接到哪個主表,那麼有幾個相同的表都是錯誤的,每個表包含十幾個字段?例如:
在這裏,我們有一個包含相同信息的兩個表,但唯一的區別是,一個表是Teachers
地址,另一種是Students
。這些對我來說是多餘的,而且它們應該只是一張桌子 - 但是當我嘗試將ORM應用於此時,我失去了數據庫限制它們的能力(對嗎?),並且使它變得更加混亂。
這種類型的通用類型應該合併還是應該保持每個主類型的分離?
更新
下面這些問題的答案已指示我到下面的解決方案,它基於數據庫中的子類表。我最初的問題之一是我有一個公用表共享多個其他表,因爲該實體類型是其他表共用。處理該問題的正確方法是對共享表進行子類化,並從共同父節點實質上下降它們,並將常用數據類型鏈接到此新父節點。下面是一個例子(記住我實際的數據庫無關,與教師和學生,所以這個例子的高度製造,但其概念是有效的):
由於Teachers
和Students
要求兩者PhoneNumbers
中,解決方案是創建一個超類Party
和FK PhoneNumbers
到Party
表。另請注意,您仍然可以使用與Teachers
相關的FK表,或者只與Students
有關。在這個例子中,我還將Students
和PartTimeStudents
分成了多個層次並從Learners
下降。
這個解決方案非常令人滿意的地方是我在一個ORM中實現它,比如Entity Framework。
查詢很容易。我可以查詢所有教師和學生提供一個特定的電話號碼:
var partiesWithPhoneNumber = from p in dbContext.Parties
where p.PhoneNumbers.Where(x => x.PhoneNumber1.Contains(phoneNumber)).Any()
select p;
,它只是簡單做了類似的查詢,但僅適用於僅屬於教師PHONENUMBERS:
var teachersWithPhoneNumber = from t in dbContext.Teachers
where t.Party.PhoneNumbers.Where(x => x.PhoneNumber1.Contains(phoneNumber)).Any()
select t;
這已經簡潔地向我解釋了。我不喜歡我當前的數據庫是它有引用多個表的外鍵。現在,我瞭解如何安排我的表格,以便常見數據保留在公共數據中。我今天做了一些測試,將它帶入Entity Framework,並寫了一些很好的單元測試。我對這個結果很好,我對此非常有信心。 –
引用多個表的外鍵實際上不是外鍵。它不能被數據庫強制執行(因爲沒有單獨的主表),它需要隨着時間的推移創建各種不規則的視圖來假裝客戶端代碼中沒有多個表。我很高興聽到您的初步測試進展順利。 – Godeke