【问题标题】:Mapping subclasses in ternary relationships在三元关系中映射子类
【发布时间】:2017-09-23 10:57:16
【问题描述】:

中间表的复合主键中的属性是否可以为空?我有一个三元关系,其中两个实体有子类。子类有自己唯一的主键。中间表的主键由子类主键组成(见下图),因此有时某些属性会为空。

我在中间表中下了订单。您可以看到这些属性有时会为空。例如,客户从餐厅菜单中订购了一些东西,然后餐饮订单 ID 将为空。这样做可以吗?如果不是应该怎么做?

【问题讨论】:

    标签: database entity-relationship


    【解决方案1】:

    复合键字段不能为空。 customermenu 应该隐藏它们各自的抽象,以便 orders 不会对特定类型的客户或菜单有硬性依赖。如果你需要一个中间表,给它一个合成主键,让它处理餐厅和餐饮菜单之间的区别。使用表继承(如果您有 Postgres)或视图来表示每种类型的客户或菜单的完整数据集。

    但首先要确保您确实需要拆分这些表——外键为空是可以的,但首先较少的表和外键会使应用程序逻辑更容易。

    【讨论】:

    • 那么对于中间订单()表,我应该交换来自菜单子类表餐厅和餐饮菜单的两个主键吗?那么用超类菜单中的主键替换这两个键,然后使用三个外键将该主键链接回这三个表?
    • orders 应该有 customer_idmenu_id 外键,每个单列分别引用 customersmenus 中的单列主键。如果您需要将餐厅和餐饮菜单分成单独的表(请仔细考虑这一点——一张表中的稀疏数据并不是世界上最糟糕的事情!),menus 应该有 restaurant_menu_idcatering_menu_id外键,其中任何一个都可以为空。您可以使用检查约束来确保至少有一个具有值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 2015-08-19
    • 2013-05-26
    • 1970-01-01
    • 2015-03-15
    • 2016-09-01
    • 1970-01-01
    相关资源
    最近更新 更多