关系数据库设计

问题描述:

我想了解实体,表和外键。我有以下几点: -关系数据库设计

AnObject - 我已经确定这是一个实体类型。

ID (Primary Key)  
Description  
State  
DependsOn  
Creator 

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

问:

应该说明是自己的实体类型?它会是一个实体类型还是 只是一个表格?国家应该有一个外键的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只能有一个创作者?

感谢,

国家可能仅仅是一个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 

我认为是需要的父子关系的依赖,但如果情况并非如此,你可能要命名表或字段不同。

您可以使用AnObject的外键向枚举值添加额外的表。状态可能会被最好地表示为varchar不为null的单个字段。你可以让一个表的主键是一个varchar字段 - 它们不一定是int类型。

这将限制值,但允许你使用合理的语法来查询事物(即WHERE状态='活着'(尽管在这种情况下,我认为你过早地抽象了事物 - 我会保持简单和公正有一个简单的布尔列IsDead)。

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