我正在设计一个代表一小群人的小型数据库,主表中的列类似于ID
、Full_Name
、birth_Date
、Address
等。
在关系(单身或已婚)方面,我有三种可能性:
- 一个人
可能是一个人(假设我们通过一个保存值 0 的字段来引用它)。
一个人可能在关系中,但在这个社区之外(假设我们通过一个持有值 1 的字段来引用它)。
一个人可能与这个社区内的某个人有关系(我们用 1 来指代,但我们需要引用第二个人 { = 他的 ID} 来检索他的数据)。
这个问题的最佳实际设计是什么?
此设计:
Person (ID, Name, Birth_Date, is_Married, Partner_ID)
- 单曲:
Partner_ID = 0
- 嫁给外人:
Partner_ID =1
- 否则:(在社区内结婚):
Partner_ID
会指另一个 记录在同一表中。
或者这个:
Person (ID, Name, Birth_Date, Relationship_ID)
Relationships (ID, Person_ID, Partner_ID)
单人:
Person.Relationship_ID = 0
与外人结婚:
Person.Relationship_ID <> 0
和Relationships.Partner_ID = 0
其他(在社区内结婚):
Person.Relationship_ID <> 0
以及Relationships.Partner_ID <> 0
如果您正在使用一个庞大且提及良好的项目,那么将推荐第二个(第二个是正确的方法,它符合所有规范化定律,需要做一个小的更改,从第一个表中删除RelationShip_ID
)。字段Person_ID
将连接两个表
否则,您可以使用第一种方案(将允许空值设置为Partner_ID
)。很多实时项目都在使用第一个选项,所以不用担心。