使用的示例并不代表我实际解决的域名;仅举例来说。
背景
我正在定义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
);
答案 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。
最好的问候。