【发布时间】:2017-09-23 10:57:16
【问题描述】:
中间表的复合主键中的属性是否可以为空?我有一个三元关系,其中两个实体有子类。子类有自己唯一的主键。中间表的主键由子类主键组成(见下图),因此有时某些属性会为空。
我在中间表中下了订单。您可以看到这些属性有时会为空。例如,客户从餐厅菜单中订购了一些东西,然后餐饮订单 ID 将为空。这样做可以吗?如果不是应该怎么做?
【问题讨论】:
标签: database entity-relationship
中间表的复合主键中的属性是否可以为空?我有一个三元关系,其中两个实体有子类。子类有自己唯一的主键。中间表的主键由子类主键组成(见下图),因此有时某些属性会为空。
我在中间表中下了订单。您可以看到这些属性有时会为空。例如,客户从餐厅菜单中订购了一些东西,然后餐饮订单 ID 将为空。这样做可以吗?如果不是应该怎么做?
【问题讨论】:
标签: database entity-relationship
复合键字段不能为空。 customer 和 menu 应该隐藏它们各自的抽象,以便 orders 不会对特定类型的客户或菜单有硬性依赖。如果你需要一个中间表,给它一个合成主键,让它处理餐厅和餐饮菜单之间的区别。使用表继承(如果您有 Postgres)或视图来表示每种类型的客户或菜单的完整数据集。
但首先要确保您确实需要拆分这些表——外键为空是可以的,但首先较少的表和外键会使应用程序逻辑更容易。
【讨论】:
orders 应该有 customer_id 和 menu_id 外键,每个单列分别引用 customers 和 menus 中的单列主键。如果您需要将餐厅和餐饮菜单分成单独的表(请仔细考虑这一点——一张表中的稀疏数据并不是世界上最糟糕的事情!),menus 应该有 restaurant_menu_id 和 catering_menu_id外键,其中任何一个都可以为空。您可以使用检查约束来确保至少有一个具有值。