0

我试图理解实体、表和外键。我有以下内容:-

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

ID (Primary Key)    
Description    
State    
DependsOn    
Creator

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

问题:

State 应该是它自己的实体类型吗?它是一个实体类型还是一个表?State 是否应该有 AnObject 的外键,反之亦然?例如

状态

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

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

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

谢谢,

4

2 回答 2

0

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

这将限制值,但允许您使用合理的语法来查询事物(即 WHERE state = 'Alive' (尽管在这种情况下,我认为您过早地抽象事物 - 我会保持简单,只是有一个简单的 bool IsDead 列)。

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

于 2013-02-24T16:42:59.900 回答
0

状态可能只是一个enum字段,除非您需要用户能够通过用户界面添加其他状态值,在这种情况下,您可以按照您的建议使用查找表(一对多关系)。我不知道您使用的是什么数据库,但这里有一些关于enumMySQL 类型的信息: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

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

于 2013-02-24T16:38:25.507 回答