【问题标题】:DB Design: Table Inheritance and Hierarchy数据库设计:表继承和层次结构
【发布时间】:2017-11-13 12:53:44
【问题描述】:

使用的示例并不代表我实际解决的领域;只是举例。

背景

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

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

然而,将表继承(位置 > 州、市)和命名层次结构(州

问题

我想定义一个唯一键强制城市名称在州内是唯一的,但名称字段的抽象阻止了这种情况。如果需要,我可以在 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
);

【问题讨论】:

  • 威斯康星州有 6 个斯普林菲尔德。 Texarkana 位于德克萨斯州和阿肯色州
  • States/Cities 不是我的实际问题域;我只是用它作为例子,所以重复城市名称的现实不是问题。

标签: oracle inheritance database-design hierarchy


【解决方案1】:

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

【讨论】:

  • 澄清:在不同的州可以有2个城市命名为纽约,也可以有一个州和一个城市分别命名为纽约,但同一州不能有2个城市命名为纽约.
【解决方案2】:

向位置表添加“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”location_id。

最好的问候。

【讨论】:

  • 虽然这确实阻止了重复的州,但它不会阻止重复的州内城市。该解决方案应适用于层次结构的任何级别。
  • 嗨彼得,假设您有两个州:id name parent_location_id 1. Oregon 0 2. California 0 现在您输入一个城市:3. Portland 1 您将无法输入另一个名称为 = 的城市"Portland" 和 parent_location_id = 1,因为它会违反唯一性约束。
  • 同意;这就是为什么我需要一个“执行城市名称的唯一密钥在州内是唯一的”所以 state_id 和 name 都是必需的。我的问题围绕着重组我的表的策略,以便可以在这两个字段上定义唯一约束。
猜你喜欢
  • 2011-06-16
  • 2023-03-09
  • 1970-01-01
  • 2014-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多