【发布时间】:2011-08-18 23:28:19
【问题描述】:
我有实体关系模型 (ERD),其中实体 IndividualCategory 和 TeamCategory 与实体 Category 相关。现在我想在 Oracle DB 中创建表。我是这样开始的:
CREATE TABLE Category(
category_id INT PRIMARY KEY,
...
);
CREATE TABLE Individual_category(
category_id INT CONSTRAINT fk_cat_indivcat REFERENCES Category(category_id),
...,
CONSTRAINT pk_indivgamecat PRIMARY KEY (category_id)
);
CREATE TABLE Team_category(
category_id INT CONSTRAINT fk_cat_teamcat REFERENCES Category(category_id),
...,
CONSTRAINT pk_teamcat PRIMARY KEY (category_id)
);
外键和主键约束的这种组合确保了对于每个Individual_category,Category“超级”表(或“父“ 桌子 ?)。对于特定的Category 记录,只有一个IndividualCategory 记录。 Team_category 也一样。
为了强制继承,我还需要一个约束:确保Category 中的每条记录在IndividualCategory (X) 或TeamCategory 中都有记录,但不能同时在两者中都有一个记录。
如何创建这样的约束?
编辑:这就是我所说的“E-R 模型中的继承”。这是来自我的 DB 老师的幻灯片(他们在那里称其为“实体子类型”,但他们有时称其为继承):
【问题讨论】:
-
"inheritance" 表示分层数据,本示例不建议这样做。只是外键...
-
@OMG Ponies:我不明白你的意思......事实上,所有 3 个表中都有更多的列。
Category中的所有列都应该继承到两个子表。但是怎么做呢?这就是问题所在。 -
你的术语会阻碍你找到你想要的答案。没有像对象那样的“继承”——外键仅验证列中的值是否已存在于 table.column 约束所指的列中。
-
@OMG Ponies:+1 我觉得我的问题有问题,可能是术语……好吧,让我们用非常简单的话解释我的问题:我得到了 ER 模型作为任务。
Category(父)和IndividualCategory、TeamCategory(子)之间存在继承关系。Category实体有一些属性(例如:category_name)。IndividualCategory和TeamCategory都在Category的基础上增加了一些。我必须编写 SQL 来创建与 E-R 模型中的实体相对应的表。我该如何处理这种继承,以便我的... -
“Entity”和“table”都是ER模型的一部分——“entity”是逻辑版本,“table”是物理版本。物理版本处理实际的列定义和数据类型大小问题。逻辑只是关于什么实体(一般会变成表格)和它们之间的关系。但是在我遇到的任何数据库设计/建模中都没有继承关系/约束——只是外键,用来展示父子关系。
标签: sql oracle database-design data-modeling foreign-key-relationship