【问题标题】:Can one field in a composite key be dependent on the other?复合键中的一个字段可以依赖于另一个字段吗?
【发布时间】:2019-06-05 20:58:43
【问题描述】:

我正在考虑为我的表(由两个字段,字段 A 和 B)组成一个复合键。但是,字段 B 依赖于字段 A。这个复合键会违反任何数据库设计原则吗?

【问题讨论】:

  • 依赖?你的意思是 B 是以某种方式从 A 计算出来的,还是你的意思是别的?计算列可以用作键,仅供参考。
  • 在这种情况下,代理主键(例如标识列)可能更可取。
  • 这只是一个例子,但这里有一个和我类似的情况。假设您有一个汽车制造商列和一个汽车型号列。数据库看起来有以下列(汽车制造商、型号)。由于有许多汽车型号属于同一汽车制造商,因此必须将汽车制造商和型号结合起来才能有唯一的索引。型号取决于制造商,因此它符合我原帖的 A 和 B 模式。像这样结构的表(surrogate_prime、automaker、model)不合适,(在下一条评论中继续)
  • 因为模型仍然依赖于汽车制造商,这不是主键。
  • 如果models是唯一的,这意味着两个不同的品牌不能有相同的model,那么model应该是你的主键,而make应该是一个引用汽车制造商表的外键。

标签: sql composite-key


【解决方案1】:

嗯,是的。它确实违反了数据库设计原则。为什么不直接使用A?也就是说,您始终可以使用JOIN 查找B 的值,因此不需要复合外键引用。在引用表中存储B 的值是多余且低效的(占用数据页和索引页的空间)。

在某些情况下,这样的外键很有用。您没有提供足够的信息来了解您是否有这种情况。因此,作为一般设计原则,这听起来不正确。可能会有例外,所以这并不总是一个坏主意。

【讨论】:

  • B 可能依赖于 A 以及 C、D 等。在这种情况下,A 本身可能不足以成为唯一的主键,并且需要像 B 这样的东西(它依赖于 A 以及其他依赖项)以形成唯一的复合主键。我认为这种事情并非完全没有道理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-16
  • 2013-12-26
  • 2019-03-11
  • 1970-01-01
相关资源
最近更新 更多