【问题标题】:Can a foreign key be the only primary key外键可以是唯一的主键吗
【发布时间】:2013-10-14 10:32:53
【问题描述】:

我有一个简单的问题。表可以将其唯一的主键作为外键吗?

澄清一下。当我一直在创建表时,我有时会有一个包含多个键的表,其中一些是外键。例如:

create table Pet(
Name varchar(20),
Owner char(1),
Color varchar(10),
primary key(Name, Owner),
foreign key(Owner) referecnes Person(Ssn)
);

所以现在我想知道是否可以这样做:

create table WorksAs(
Worker char(1),
Work varcahr(30),
primary key(Worker),
foreign key(Worker) references Person(Ssn)
);

这将导致两个表具有完全相同的主键。这是应该避免的事情还是设计数据库的好方法?如果上述不是一个好的标准,我也会简单地将 Work 变量设为主键,这很好,但如果不需要,跳过它似乎更简单。

【问题讨论】:

  • 我认为你的表 WorkAs 应该是一个关系表。这意味着您可以拥有一个包含 WorkPlaces 的表,一个包含 Workers 的表和一个表 WorksAs 以与 Worker->WorkPlace 建立关系。否则,为什么不使用同一张表(Worker)并添加带有 char Workplace 的列?但是回答你的问题,是的,你可以拥有它。
  • 我会说很好。但是......为什么不将这些字段(在 WorksAs 中)直接移动到 Person 表中(在那里可以为空)?少了一张桌子。少一个加入。
  • 首先,这只是我在提出这个问题时想到的一个不好的例子,因为它更容易解释我想知道的内容。其次,我想知道这一点的原因是因为我正在处理一个我们应该从我们的数据库中消除 NULL 值的任务。因此,如果我将 WorksAs 放在 Person 表中,我会遇到我不想要的可能 NULL 值的问题 :)
  • 我跟着你,因为有很多数据使用不当,这是一个糟糕的情况,我想这就是你现在要远离的地方。无论如何,我个人会将它们移到(可为空的)另一个表中,正确命名将是可空字段的正确使用,而不是拆分表。我不知道你的全部故事,拆分表可能还有很多其他原因,所以不想在这里发表明确的声明。无论如何,您的问题似乎已经得到解答! :)

标签: sql


【解决方案1】:

是的,这样做是完全合法的。

其实这是IS-A relations的基础;)

【讨论】:

    【解决方案2】:

    是的。由于以下原因。

    1. 将它们设为主键将强制唯一性(而不是暗示它)。
    2. 大概会聚集主键(取决于 dbms),这将提高某些查询的性能。
    3. 它节省了添加唯一约束的空间,在某些 DBMS 中也会创建唯一索引

    【讨论】:

      【解决方案3】:

      是的,你可以这样做。但是你需要小心,因为外键可以有 NULL 值,而 Primary 不能。

      【讨论】:

      • 虽然这当然是对的,但 OP 专门询问“表可以将它的唯一主键作为外键吗?”,所以我猜他会在细节中添加主键约束桌子也一样。
      • 很公平..但是我自己是 mysql 的初学者,我想到的第一件事是 Jesper 可能面临 NULL 值的问题,结果证明是正确的。
      【解决方案4】:

      当然。您可以在使用Concrete Table InheritanceClass Table Inheritance 方法映射继承层次结构时使用此方法,参见例如SQL Alchemy docs

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-17
        • 1970-01-01
        • 2013-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-31
        相关资源
        最近更新 更多