0

我有 ENTERPRISES 和 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 用于主域列还是字符串值,因此 ENTERPRISES 表对 DOMAINS 表没有循环依赖关系?

4

3 回答 3

3

两者都是正确的。但是去FK。

您建议的那个具有较少的稀疏数据,而在第二个示例中,您可能有 100 个属于同一公司的域,所有域都IsPrimary设置为False,只有一个域设置为True

此外,在第一个场景中只执行一个主域更容易,而在第二个场景中,您必须在代码中编写触发器或检查以查看始终存在一个且只有一个主域。

再次,坚持 FK。

于 2009-11-24T16:06:50.473 回答
1

循环引用是可以的。循环依赖不是。只要是Primary Domain ID可以为空的,那么你就可以了。否则,您将遇到先有鸡还是先有蛋的情况,无法创建Domain没有 a 的a Enterprise,也无法创建Enterprise没有 a 的 a Primary Domain ID

我会选择前者(您提出的解决方案),因为您正在定义一对一的关系。虽然Enterprise->Domain关系是一对多的,但Enterprise->Primary Domain关系是一对一的。

于 2009-11-24T16:07:33.607 回答
1

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

那么问题是您将无法插入数据,因为您已经创建了循环依赖。您无法插入没有域的企业,也无法插入没有企业的域。

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

于 2009-11-24T16:12:06.143 回答