我正在尝试理解实体,表格和外键。我有以下内容: -
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只能创建一个创建者吗?
谢谢,
答案 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)。这里真正的问题是你打算如何查询这些项目以及它们中有多少项目。如果你想立即拔出整个依赖链并且链很长,你想避免做数百个单独的查询来做到这一点。你的用例是什么?