我有企业和域表。每个企业的属性是它应该有一个主域,但它可以有多个域。我想出了这个表结构
+---------------------------------------+
| ENTERPRISES |
+----+--------------+-------------------+
| ID | Name | Primary Domain ID |
+----+--------------+-------------------+
| 1 | Enterprise A | 2 |
| 2 | Enterprise B | 4 |
+----+--------------+-------------------+
+---------------------------------------+
| DOMAINS |
+----+------------------+---------------+
| ID | Domain Name | Enterprise ID |
+----+------------------+---------------+
| 1 | ent-a.com | 1 |
| 2 | enterprise-a.com | 1 |
| 3 | ent-b.com | 2 |
| 4 | enterprise-b.com | 2 |
+----+------------------+---------------+我的同事提出了这个替代结构:
+-------------------+
| ENTERPRISES |
+----+--------------+
| ID | Name |
+----+--------------+
| 1 | Enterprise A |
| 2 | Enterprise B |
+----+--------------+
+----------------------------------------------------+
| DOMAINS |
+----+------------------+---------------+------------+
| ID | Domain Name | Enterprise ID | Is Primary |
+----+------------------+---------------+------------+
| 1 | ent-a.com | 1 | False |
| 2 | enterprise-a.com | 1 | True |
| 3 | ent-b.com | 2 | False |
| 4 | enterprise-b.com | 2 | True |
+----+------------------+---------------+------------+我的问题是,哪个更有效/更正确?
另外,在第一个示例中,我应该使用ID作为主域列还是使用字符串值,这样企业表就不会对域表有循环依赖关系?
发布于 2009-11-25 00:07:34
循环引用是可以的。循环依赖不是这样的。只要Primary Domain ID是可以为空的,那么就没问题。否则,您将面临一个先有鸡还是先有蛋的场景,没有Enterprise就无法创建Domain,但是没有Primary Domain ID也无法创建Enterprise。
我会选择前者(您提出的解决方案),因为您定义的是一对一的关系。Enterprise->Domain关系是一对多,而Enterprise->Primary Domain关系是一对一。
发布于 2009-11-25 00:06:50
两者都是正确的。但是去找FK吧。
您建议的域具有较少的稀疏数据,而在第二个示例中,您可能有100个域属于同一公司,所有域的IsPrimary都设置为False,而只有一个域设置为True。
此外,在第一个场景中只强制执行一个主域会更容易,而在第二个场景中,您必须在代码中编写触发器或检查,以查看始终存在且只有一个主域。
再说一次,坚持FK。
发布于 2009-11-25 00:12:06
在第一个模型中,您说企业应该有一个主域。扩展一下,说它将有一个主域。此时,您可能倾向于将该列标记为不可为空。
那么问题就是你不能插入数据,因为你已经创建了一个循环依赖。您不能插入没有域的企业,也不能插入没有企业的域。
我更喜欢第一个模型,因为它更清晰、更明确。您的模型强制存在一个单一的主域,其中第二个模型中没有任何内容,因此您将被迫使用其他机制来强制执行此规则。
https://stackoverflow.com/questions/1791049
复制相似问题