[英]Database modeling for a weak entity
我的数据库orders
和orderHistory
有2个表。
----------------- -----------------------
| orders | | orderHistory |
----------------- -----------------------
| orderID (PK) | | historyLineID (PK) |
| orderDate | | status |
| price | | quantity |
----------------- -----------------------
现在order
可以有多个history lines
。 但是, history line
不能单独存在。 我听说这个被称为弱实体,因此从PK orders
必须是表的PK的一部分orderHistory
。
问题
order
的PK添加到表orderHistory
并使其成为复合主键吗? orderHistory
,我将如何添加新的复合键? ( orderID
可从表orders
,但historyLineID
应自动递增。) orderID
添加为外键而不是只 ? 这样做的缺点是什么? 注意
orderID
和historyLineID
都是代理键。 提前致谢。
一个实体并不弱,因为它不能独立存在,而是因为它无法独立识别 。 因此,“引导”到弱实体的关系称为“识别”关系。 在实践中,这意味着父母的主键被迁移到子PK的(通常是适当的 )子集中(术语“弱实体”通常与主键相关地定义,但理论上它可以应用于任何键)。
拥有一个不能独立存在的实体是完全合法的,但可以独立识别 - 换句话说,就是与非NULL的非识别关系。
您必须要问: historyLineID
可以单独使用 ,还是与orderID
结合使用? 我怀疑后者就是这种情况,这会使它成为一个弱势实体。
这真的是一个正确的弱实体关系吗?
你告诉我们的不是一个弱实体 - 父母的PK不会迁移到孩子的PK中。
有没有其他方法来识别它们?
你基本上有两个选择:
orderHistory
有一个复合PK: {orderID, historyLineID}
,其中orderID
是FK。 顺便说一句,这个PK可以被认为是“自然的”:
orderHistory
有一个代理PK: {orderHistoryID}
,而orderID
在PK之外。 您仍然需要备用密钥{orderID, historyLineID}
:
我应该将表顺序的PK添加到表orderHistory并使其成为复合主键吗?
是的,这是上面描述的第一个选项。 除非您在orderHistory
本身拥有子关系, orderHistory
这也是最佳解决方案。 如果orderHistory
确实有孩子,那么这可能是也可能不是最佳解决方案,具体取决于几个因素。
如果我决定将其建模为正常的一对多关系,其中orderID被添加为外键,该怎么办? 这样做的缺点是什么?
这不是 - 或者。 字段可以是FK和(主要或备用)键的一部分,如上所示。
如果所有表都处于第3范式,那么在设计的后期会忽略弱实体会导致任何问题吗?
除非您正确指定密钥,否则您将无法达到3NF,如果不考虑哪个实体可以独立识别,哪个不能独立识别,您将无法做到这一点。
这听起来像是一种可选的强制性关系。 所以你的orderId在orderHistory中有“可选”属性...... 2.你可以通过使主键成为orderID和historyLineID 3的组合来部分解决问题。你必须在orderID表上做一个复杂的关系。 因此,您必须重新加入order.orderID,然后创建新的historyLineID,否则您无法创建尚未存在的内容。 这是应该的方式。 对于处理脚本的未来人员,以及可能是您自己,更容易理解这种方式。 使用外键创建具有多个historyLineID(子)的orderID(父),因为订单可以有多个订单行,这种方法可能是最好的。
链接: 在此输入链接说明
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.