我正在阅读Len Silverston的数据建模书籍。
例如,我们有两个表:
Len Silverston说:
要标识为主键组合的主键 属性(用“#”标识)以及主键 与波浪号的关系指向的实体。
Therefore the primary key to the ORDER ITEM is the order item seq ID plus the primary key of the order, order id.
当我在RDBMS(Mysql)中实现这个模型系统时,我感到困惑:
如何查找作为订单子项的所有订单商品?
当我们删除订单时,如何确保所有订单商品(订单的子订单)之前被删除?
如果订单商品有多个外键会发生什么?
答案 0 :(得分:2)
“因此,ORDER ITEM的主键是订单商品seq ID 加上订单的主键,订单ID。“
看起来像identifying relationship 1 。或部分表示多对多关系。
在任何情况下,上图都不完整 - 它不显示通过关系迁移的属性。换句话说,“ORDER ITEM”实体中应该有一个“ORDER ID”属性。
1 在这种情况下,复合键中属性的顺序应该是相反的(即{“ORDER ID”,“SEQ ID”}),以物理{{3同一个订单中的项目。
“如何查找作为订单子项的所有订单商品?”
如果您已经知道订单ID,那么您可以:
SELECT *
FROM "ORDER ITEM"
WHERE "ORDER ID" = <known value>
否则你可以:
SELECT *
FROM "ORDER ITEM"
WHERE "ORDER ID" = (SELECT "ORDER ID" FROM ORDER WHERE <some search criteria>)
甚至:
SELECT "ORDER"."ORDER ID", <other fields...>
FROM "ORDER" JOIN "ORDER ITEM" ON "ORDER"."ORDER ID" = "ORDER ITEM"."ORDER ID"
WHERE <some search criteria>
“当我们删除订单时,如何确保所有订单商品(订单的子订单)之前被删除?”
可能最简单的方法是使用适当的级联参照动作......
CREATE TABLE "ORDER ITEM" (
...
FOREIGN KEY ("ORDER ID") REFERENCES ORDER ("ORDER ID") ON DELETE CASCADE
)
...当您删除父级时,DBMS将自动删除相应的子级。
否则,你可以像这样手动删除:
DELETE FROM "ORDER ITEM"
WHERE "ORDER ID" = <known value>
甚至:
DELETE FROM "ORDER ITEM"
WHERE "ORDER ID" = (SELECT "ORDER ID" FROM ORDER WHERE <some search criteria>)
“如果订单商品有多个外键会发生什么?”
没什么特别的。 DBMS将为每个声明的外键强制引用完整性。可以“合并”通过多个外键迁移的字段,这对于正确建模某些情况是必要的,而对其他情况则完全错误。
您是否有任何特定情况需要了解更多信息?