在多对一表中使用哪个外键

时间:2010-09-15 00:03:57

标签: sql mysql database foreign-keys

假设我有一个包含Book_ID(主键),ISBN(唯一)和其他几个如Title / author / etc等列的书籍。

我有另一个表Sales,主键为Sales_ID,链接到Books的外键,以及包含Sales信息的其他字段。只有具有ISBN的图书才有销售。将Book_ID或ISBN作为主键是更好的数据库设计吗?注意:无论选择哪个外键,我都将LEFT JOINING Sales to Books。

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

3 个答案:

答案 0 :(得分:0)

我会一直使用你的主键

答案 1 :(得分:0)

一般情况下,我认为我会将surrogate primary key book_id作为外键。

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

  • 某本书可能缺少或未知ISBN。如果出售那本书,你会怎么做?
  • 您的ISBN可能不正确。要编辑它,您必须更新将其用作外键的所有表。
  • 您可能希望将来开始销售没有ISBN的图书。你为什么要在没有ISBN的情况下存储书籍?
  • book_id上的索引应该比ISBN字段上的索引更紧凑。

答案 2 :(得分:0)

我会一直使用ISBN。通过这种方式,您可以通过一种简单的方式来强制执行业务规则,“仅对具有ISBN的图书进行销售”,即在ISBN表格中生成NOT NULLSales并引用{{ 1 {} ISBN表中的列。

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