数据库设计:混淆了Len Silverston的概念

时间:2014-02-14 04:13:03

标签: database-design rdbms ofbiz

我正在阅读Len Silverston的数据建模书籍。

例如,我们有两个表:

enter image description here

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)中实现这个模型系统时,我感到困惑:

  • 如何查找作为订单子项的所有订单商品?

  • 当我们删除订单时,如何确保所有订单商品(订单的子订单)之前被删除?

  • 如果订单商品有多个外键会发生什么?

1 个答案:

答案 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将为每个声明的外键强制引用完整性。可以“合并”通过多个外键迁移的字段,这对于正确建模某些情况是必要的,而对其他情况则完全错误。

您是否有任何特定情况需要了解更多信息?