标志列还是外键?

时间:2009-11-24 16:03:51

标签: sql ddl

我有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表没有循环依赖?

3 个答案:

答案 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)

在第一个模型中,您说企业应该有一个主域。展开一下,说它将有一个主域。此时,您倾向于将该列标记为不可为空。

问题是,由于您创建了循环加速,因此无法插入数据。您无法在没有域的情况下插入企业,也无法在没有企业的情况下插入域。

我更喜欢第一个模型,因为它更清晰,更明确。您的模型强制执行单个主域,其中第二个模型中没有任何内容,因此您将被迫使用其他机制强制执行此规则。