2011-02-24 73 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

相关问题