数据库设计:表继承和层次结构

时间:2017-11-13 12:53:45

标签: oracle inheritance database-design hierarchy

使用的示例并不代表我实际解决的域名;仅举例来说。

背景

我正在定义table inheritance。计划使用Table API包&视图处理必要的逻辑和介绍

我还需要定义多个具有不同属性的多级命名层次结构。

组合表继承(Location> State,City)&然而,命名的层次结构(State< - City)是我遇到设计障碍的地方。

问题

我想定义一个唯一密钥强制执行城市名称在州内是唯一的,但名称字段的抽象是阻止它。如果需要,我可以在PL / SQL中处理它,但是如果可能的话,我想在SQL级别(理想情况下没有附加表)强制执行它。

约束

其他表格通常需要能够引用层次结构的任何级别(位置)。

其他表也需要能够引用层次结构的特定级别。

思想

由于关系图的复杂性,我无法做single table inheritance

我考虑过重复名称字段以方便,但我宁愿不违反普通表格。

示例

CREATE TABLE location
( id      NUMBER  (  38) PRIMARY KEY
, name    VARCHAR2(1000) NOT NULL
, type_id NUMBER  (  38) NOT NULL
--, other common/super attributes
);

CREATE TABLE state
( id NUMBER(38) PRIMARY KEY
                REFERENCES location (id)
--, child attributes
);

CREATE TABLE city
( id       NUMBER(38) PRIMARY KEY
                      REFERENCES location (id)
, state_id NUMBER(38) NOT NULL
                      REFERENCES state    (id)
--, child attributes
);

2 个答案:

答案 0 :(得分:0)

我不明白为什么要求城市和州名称是唯一的(因此将它们保存在相关表格中)会违反任何正常形式。城市名称与州名“纽约”城市不同的属性!=“纽约”州例如。

答案 1 :(得分:0)

添加" parent_location"到位置表可能适合你。

CREATE TABLE location
( id      NUMBER  (  38) PRIMARY KEY
, name    VARCHAR2(1000) NOT NULL
, type_id NUMBER  (  38) NOT NULL
, parent_location_id number( 38) NOT NULL
--, other common/super attributes
);

CREATE UNIQUE INDEX location_u2
   ON location (parent_location_id, name);

CREATE TABLE city
( id       NUMBER(38) PRIMARY KEY
                      REFERENCES location (id)
, --state_id gone away
--, child attributes
);

它还可以防止有两个同名的状态。

缺点是你需要使用假人" 0" top节点的location_id。

最好的问候。