2011-02-24 42 views
0

將一種類型的對象與多種類型的其他對象中的一種關聯的最佳方式是什麼?數據庫:將一種類型的記錄與多個其他表相關聯

例如,簡單的場景:

tblNews (_newsId_, _title_) 
1, Hello world 
2, Lorem ipsum 

tblPeople (_personId_, _personName_) 
1, John Smith 
2, Joe Bloggs 

tblPlaces (_placeId_, _placeName_) 
1, Townville 
2, Smallplace 

什麼是用於定義tblNews的項目和兩國人民和地方之間的關係(例如新聞項目NewSID的= 1(你好世界上最好的方法)可能是與personId = 2(Joe Bloggs)和PlaceId = 1(Townville))相關?我已經使用兩個表中考慮:

tblObjectTypes (_typeName_, _typeTable_, _typePK_) 
person, tblPeople, personId 
place, tblPlaces, placeId 

tblNewsRelationships (_relationshipId_, _newsId_, _objectType_, _objectKey_) 
1, 1, person, 2 
2, 1, place, 1 

這裏tblNewsRelationship限定了新聞項是在關係,它涉及一種類型的對象和該對象的主鍵。

tblObjectTypes包含每種類型的對象,該新聞項目可能涉及到,這表類型的對象存儲在和領域應該用來看看他們。代碼將轉到tblObjectTypes,查找關係中定義的objectType,並使用typeTable和typePK查找給定其objectKey的正確記錄。

然而,這似乎是什麼似乎像它應該是一個普遍的問題非常令人費解。我已經搜索和搜索,但不知道描述這種關係類型的術語是不可能找到有用的東西的,所以我不知道是否存在創建這種關係的「正確」方式。

對不起,問這麼長的問題。

+0

我環顧四周多一點,和父/子類型的解決方案(如http://stackoverflow.com/questions/4969133/database-design-problem)似乎是最合適的。 – rossng 2011-02-26 16:45:21

回答

1

新聞項目可以與一個人,一個地方,對不對?所以新聞表應該有一個名爲person_id的列和一個名爲place_id的列。每個新聞行都會有相應的人或地點的相應ID號。

「外鍵」是你想要的期限。

+0

在這種情況下,您無法將項目與多個人或地點聯繫起來,因此您最終會收到大量重複的新聞項目。另外,如果新聞項目只與一個或另一個有關,則會開始獲取大量空字段。 – rossng 2011-02-25 12:28:37

+1

啊,那你想要一個「連接表」。我會設置它,以便新聞項目與人有很多關係,並且新聞項目與地點有很多關係。多關係是通過一個連接表(每個關係一個)定義的,它包含一個news_id和一個person_id。 (其他連接表包含news_id和place_id)。 – Satya 2011-02-25 23:03:58

相關問題