首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >标志列还是外键?

标志列还是外键?
EN

Stack Overflow用户
提问于 2009-11-25 00:03:51
回答 3查看 709关注 0票数 0

我有企业和域表。每个企业的属性是它应该有一个主域,但它可以有多个域。我想出了这个表结构

代码语言:javascript
复制
+---------------------------------------+
| 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             |
+----+------------------+---------------+

我的同事提出了这个替代结构:

代码语言:javascript
复制
+-------------------+
| 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作为主域列还是使用字符串值,这样企业表就不会对域表有循环依赖关系?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-11-25 00:07:34

循环引用是可以的。循环依赖不是这样的。只要Primary Domain ID是可以为空的,那么就没问题。否则,您将面临一个先有鸡还是先有蛋的场景,没有Enterprise就无法创建Domain,但是没有Primary Domain ID也无法创建Enterprise

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

票数 1
EN

Stack Overflow用户

发布于 2009-11-25 00:06:50

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

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

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

再说一次,坚持FK。

票数 3
EN

Stack Overflow用户

发布于 2009-11-25 00:12:06

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

那么问题就是你不能插入数据,因为你已经创建了一个循环依赖。您不能插入没有域的企业,也不能插入没有企业的域。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1791049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档