【问题标题】:Which foreign key to use in a many-to-one table在多对一表中使用哪个外键
【发布时间】:2010-09-15 00:03:56
【问题描述】:

假设我有一个表 Books,其中包含 Book_ID(主键)、ISBN(唯一)和其他几个列,例如标题/作者/等。

我有另一个表 Sales,主键 Sale_ID、链接到 Books 的外键以及其他包含 Sales 信息的字段。销售仅适用于具有 ISBN 的图书。将 Book_ID 或 ISBN 作为主键是更好的数据库设计吗?注意:无论选择哪一个外键,我都将左加入图书销售。

更新:有些图书没有 ISBN,因为它们没有与它们一起出版。但是,我不预见(至少在未来几年内)用户能够出售它们,因为我没有系统来确保不重复没有 ISBN 的给定书籍。

【问题讨论】:

    标签: sql mysql database foreign-keys


    【解决方案1】:

    一般来说,我想我会选择 surrogate primary key book_id 作为外键。

    如果您使用非主键 ISBN 作为外键,我可以确定一些潜在问题:

    • 您可能缺少或未知某本书的ISBN。万一这本书卖了,你会怎么做?
    • 您的ISBN 可能不正确。要对其进行编辑,您必须更新所有将其用作外键的表。
    • 您将来可能想开始销售没有ISBN 的书籍。为什么一开始就存储没有ISBN 的书籍?
    • book_id 上的索引应该比ISBN 字段上的索引更紧凑。

    【讨论】:

    • 用关于 NULL ISBN 书籍的信息更新了我的问题。
    【解决方案2】:

    我会一直使用你的主键

    【讨论】:

      【解决方案3】:

      我会一直使用ISBN。这样,您就有了一种简单的方法来执行您的业务规则,“销售只存在于具有 ISBN 的书籍”,即通过在 Sales 表中创建 ISBNNOT NULL 并在 @987654326 中引用 ISBN 列@表。

      我不同意@Daniel Vassallo 的观点,因为您可能希望在未来开始销售没有 ISBN 的图书,您今天就想在数据库中删除该规则。这个设计缺陷有一个名字:未来蠕变。此外,“紧凑索引”的考虑应始终排在基本数据完整性的考虑之后。

      【讨论】:

      • 我认为您过于重视此业务规则。为什么 OP 首先存储没有 ISBN 的书籍? ......我的不是一个具体的,“总是这样做,从不这样做”的答案。如果 OP 使用 ISBN 作为外键,我只迭代了一些我可以识别的潜在问题(事实上,我用更多点更新了我的答案)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-02
      • 1970-01-01
      • 2021-12-04
      • 2018-03-25
      相关资源
      最近更新 更多