Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database design 可以将复合键设置为另一个表的主键吗?_Database Design_Primary Key_Composite Key - Fatal编程技术网

Database design 可以将复合键设置为另一个表的主键吗?

Database design 可以将复合键设置为另一个表的主键吗?,database-design,primary-key,composite-key,Database Design,Primary Key,Composite Key,可以将复合键设置为另一个表的主键吗 例如,我有以下表格: 书籍-主键:产品ID 客户端-主键:客户端ID Clients\u book-具有复合主键:Product\u Id和Client\u Id 我想将Clients_Books中的这个复合主键设置为另一个名为Order_Details表的主键。但我不想使用书籍、客户表中的产品ID和客户ID 这有意义吗?所有的意见都是受欢迎的。你正走在一条黑暗肮脏的道路上。不要这样做。坚持最佳实践-在表上使用一个简单的主键,如果需要,在其他表上使用外键。

可以将复合键设置为另一个表的主键吗

例如,我有以下表格:

  • 书籍
    -主键:
    产品ID
  • 客户端
    -主键:
    客户端ID
  • Clients\u book
    -具有复合主键:
    Product\u Id
    Client\u Id
我想将Clients_Books中的这个复合主键设置为另一个名为Order_Details表的主键。但我不想使用书籍、客户表中的产品ID和客户ID


这有意义吗?所有的意见都是受欢迎的。

你正走在一条黑暗肮脏的道路上。不要这样做。坚持最佳实践-在表上使用一个简单的主键,如果需要,在其他表上使用外键。

简单的回答是,不-不能这样做。PK(或其他备用键)中的所有列必须出现在FK定义中。还要记住,一个表可以有多个键,称为候选键(有时是备用键)。主键只是设计/使用的“最佳”键(通常是最窄的一个-字节大小最小)。我们将这些其他唯一索引的名称前缀为“AK_{name}”-AK=备用键

我们在这种情况下所做的是两件事之一:

  • 将合成PK定义为“标识”列,然后向复合键添加唯一索引-因此表上有两个“键”。然后,所有子表将FK定义为指向合成标识PK列
  • 保持复合键不变。将其定义为该主表上的主键,并使所有FK具有相同的定义
  • 一般来说,让多个表具有相同的PK定义(即PK也是另一个表的FK)不是一个好主意。我说“一般”——理解实体的定义很重要

    那么为什么要使用#1呢?我问自己的问题是,复合键是否真的是定义行的数据?这个复合键真的是一行的定义,还是对其他数据来说更像是一个FK?如果它更像是一个FK,那么我创建合成的PK(标识)。订单真的是客户拥有的书吗?订单可能会导致客户拥有一本新书,但它们可能不是同一件事

    合成PK在未来几年提供了更多的选择。如果需要在Client_Books表中更改关系,则可以将更改隔离到其他表

    例如,如果客户可以拥有一本书的多个副本,您将如何实现这一点?使用合成键,您可以简单地删除复合键上的唯一索引,并将其保留为简单的FK,然后Order_Details表将简单地表示客户购买第二个副本的时间。但是,如果您在Orders路由上使用了复合键,那么您必须了解如何重新定义Order_详细信息以及客户_书籍(以及指向Order_详细信息的任何其他FK)


    我还想请您评估订单细节是否真的是客户手册?通常,订单会导致客户拥有新书。我认为订单独立于库存-因此订单详细信息上的主键不应该是客户账簿上的主键,订单详细信息应该有自己的独立主键。

    请提供有关
    订单详细信息
    表的更多信息-为什么您认为需要复合主键?谢谢回复,我需要复合主键,因为Order\u Details表应该有“来自”Clients\u Books表的条目。示例:一个clients\u Books条目:Product\u ID:1 Clint\u ID:1可能是Order\u Details表的条目。虽然订单详细信息条目(如:订单ID:1、产品ID:1、客户ID:5)具有有效的产品ID和客户ID,但考虑到书籍,Clietns表可能不是客户书籍表的实际条目。希望它更清楚..+1说得好。可能是迄今为止我所看到的一个问题最完整的答案之一。