可以将复合键设置为另一个表的主键吗?
例如,我有几张桌子:
Books -with主Key:Product_IDClient -with主键:Client_IDClients_Books -with复合主键:Product_Id和Client_ID我希望将Clients_Books中的复合主键设置为另一个名为: Order_Details的表的主键。但我不想使用图书、客户端表中的Product_ID和Client_ID。
这有道理吗?所有的意见都非常欢迎。
发布于 2010-05-24 16:36:11
简单的回答是,不-不能那样做。PK (或其他备用键)中的所有列都必须出现在FK定义中。还请记住,表可以有多个键-称为候选键(有时是备用键)。主键只是您设计/使用的“最佳”键(通常是字节大小最小的最窄的键)。我们将这些其他唯一索引的名称前缀为"AK_{ name }“- AK =备用键。
在这种情况下,我们所做的有两件事:
通常,使用具有相同PK定义的多个表(也就是对另一个表也是FKs的PKs )并不是一个好主意。我说“一般”-理解你的实体的定义是很重要的。
那么为什么要使用#1呢?我问自己的问题是,复合键是否真的是定义行的数据?这个复合键真的是行的定义吗?还是它更像是其他数据的FK呢?如果它更多的是一个FK,那么我创建合成PK(标识)。订单真的是客户拥有的书吗?订单可能会导致客户拥有一本新书,但它们可能不是一回事。
有了合成PK提供了更多的选择,在未来的道路上。如果关系需要在Client_Books表中更改,则可以将更改与其他表隔离。
例如,如果一个客户可以拥有一本以上的一本书,你将如何实现?使用合成密钥,您可以简单地删除复合键上的唯一索引,并将其保留为简单的FK,然后Order_Details表将简单地表示客户购买第二份副本时的情况。但是,如果您在Orders路由上使用了复合密钥,那么您就必须弄清楚如何重新定义Order_Detail和Client_Books (以及指向Order_Detail的任何其他FKs )。
我还要请您评估Order_Detail是否真的是Client_Book?通常情况下,订单会使客户拥有一本新书。我认为订单是独立于库存的-因此Order_Detail上的PK不应该是Client_Books上的PK,Order_Detail应该有自己的独立PK。
发布于 2010-02-22 21:12:18
你走在一条又黑又脏的路上。不要这样做。坚持最佳实践--在表上使用一个简单的主键,如果有必要,在其他表上使用外键。
https://stackoverflow.com/questions/2314200
复制相似问题