关系数据库设计

时间:2013-02-24 16:18:17

标签: relational-database

我正在尝试理解实体,表格和外键。我有以下内容: -

AnObject - 我已将其识别为实体类型。

ID (Primary Key)    
Description    
State    
DependsOn    
Creator

现在State只有两个值[Alive, Dead]。然而,未来它可能会有另一个。然而,它只能是一个或另一个,但它可能会在两者之间发生变化。

问题:

  

国家应该是自己的实体类型吗?它是实体类型还是   只是一张桌子? State应该有AnObject的外键还是副键   反之亦然? EG

国家

ID (PK)
Description
AnObject_ID (Foreign Key references AnObject)

问题:AnObject的DependsOn属性可以具有其他AnObject实体类型的多个值。显然一个字段不能有多个值,但我不确定如何对此进行建模?

AnObject的Creator属性也占用了一定数量的值[Fred,Jim,Dean]。我是否应该为具有AnObject ID外键的Creator创建实体类型(表)?那么,一个创建者可以创建0,1,m个AnObjects但AnObject只能创建一个创建者吗?

谢谢,

2 个答案:

答案 0 :(得分:0)

状态可以只是一个enum字段,除非您需要用户能够通过用户界面添加其他状态值,在这种情况下,您可以使用查找表(一对多关系)你建议。我不知道你正在使用什么数据库,但这里有关于MySQL中enum类型的一些信息:http://dev.mysql.com/doc/refman/5.6/en/enum.html

如果使用查找表,则AnObject应该有一个名为StateID的字段,该字段指向State表中的所需行。

听起来DependsOn是多对多的关系。为此,您需要一个连接表,例如:

Table: Dependencies

Primary key (called a "composite key" because it's made up of more than one field):
    AnObjectParentID
    AnObjectChildID

我认为父子关系需要依赖关系,但如果不是这种情况,您可能希望以不同的方式命名表或字段。

答案 1 :(得分:0)

您可以使用AnObject中的外键向枚举值添加额外的表。 State可能最好表示为varchar类型的单个字段not null。您可以将表的主键设置为varchar字段 - 它们不必是int类型。

这会限制值,但允许你使用合理的语法来查询事物(即WHERE状态='活着'(虽然在这种情况下我认为你过早抽象事物 - 我会保持简单,只是有一个简单的bool列IsDead)。

DependsOn是一个单向属性(你可能不会有A依赖于B而B也依赖于A)。这里真正的问题是你打算如何查询这些项目以及它们中有多少项目。如果你想立即拔出整个依赖链并且链很长,你想避免做数百个单独的查询来做到这一点。你的用例是什么?