我有HEB和DOMAINS表。每个企业的属性是它应该有一个主域,但它可以有多个域。我想出了这个表结构
+---------------------------------------+
| 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作为主域列还是字符串值,因此HEB表对DOMAINS表没有循环依赖?
答案 0 :(得分:3)
两者都正确。但是去找FK。
您建议的数据稀疏数据较少,而在第二个示例中,您可能有100个属于同一公司的域名,所有域名IsPrimary
都设置为False
,只有一个域设置为True
。
此外,在第一种情况下更容易强制执行一个主域,而在第二种情况下,您必须在代码中编写触发器或检查以查看是否有一个,并且在任何时候都只有一个主要域名。
再次坚持FK。
答案 1 :(得分:1)
循环引用没问题。循环依赖不是。只要Primary Domain ID
可以为空,那么你就没事了。否则你会有一个鸡蛋或鸡蛋的情况,没有Domain
就无法创建Enterprise
,但如果没有Enterprise
也无法创建Primary Domain ID
}。
我会选择前者(您建议的解决方案),因为您正在定义一对一的关系。虽然Enterprise->Domain
关系是一对多关系,但Enterprise->Primary Domain
关系是一对一关系。
答案 2 :(得分:1)
在第一个模型中,您说企业应该有一个主域。展开一下,说它将有一个主域。此时,您倾向于将该列标记为不可为空。
问题是,由于您创建了循环加速,因此无法插入数据。您无法在没有域的情况下插入企业,也无法在没有企业的情况下插入域。
我更喜欢第一个模型,因为它更清晰,更明确。您的模型强制执行单个主域,其中第二个模型中没有任何内容,因此您将被迫使用其他机制强制执行此规则。