弱实体是否需要部分密钥?或者你可以只使用其父键作为主键。
即Order和OrderItem。订单有一个PK OrderPK,而OrderItem没有部分密钥。
这被认为是不好的做法吗?
答案 0 :(得分:1)
OrderItem表应该有一个OrderID字段,使FK引用返回Orders表。这样可以确保每个项目都是有效的订单。
然后通常有另一个字段区分每个项目,这些项目将与OrderID字段一起使用以形成项目的主键。
这可能是订单中每个商品唯一的内在价值或价值。假设同一项的多次出现将合并到一个条目中,SKU或PartNum可能只是这样的值。要找到此值,只需问问自己在同一订单中唯一标识一个项目所需的最小数据量。但是,这可能是不可能的。此方案的缺点是您可能正在为关键字段使用动态数据。特定项目的SKU可能会在未来一段时间内发生变化。
或者订单中的每个商品都可能有一个顺序值(1,2,3,...)。该方案的缺点是顺序值不能由系统生成。每个订单对于每个订单都是唯一的,这必须由触发器或应用程序代码生成。
或者系统生成的顺序值对于所有订单的所有项都是唯一的,并且该字段可以是唯一的主键。查询中的row_number
函数仍然可以生成每顺序序列值,但这意味着特定项在不同查询中可能具有不同的值。这可能是也可能不是问题。
此时,只有您对系统有足够的了解才能选择最佳选项。但通常有必要让用户能够选择一个特定订单中的一个特定项目,因此通常需要对每个项目进行某种关键定义。