参考一张桌子或另一张桌子的桌子排

参考一张桌子或另一张桌子的桌子排

问题描述:

我有一张桌子包含某种items,以及这些项目所属的两个桌子(ab)。参考一张桌子或另一张桌子的桌子排

一个项目是指一排a一排b。一个ab可以有多个项目。

难道还有比以下(使用Oracle 10)一个更好的设计?

任何需要注意的缺陷?

id a_id(fk) b_id(fk) 
1   1  NULL 
2   1  NULL 
3  NULL   1 
4   2  NULL 

这是对一些罪名的相当不错的设计:

  • 随着A_ID你执行的链接表A.
  • 与B_ID你执行的链接表的外键的外键B.
  • 1:很多关系(项目和表A之间,以及项目和表B之间)都正确存储。

唯一的障碍是,这个数据库结构本身并不检查一个项目是只链接到A或B(而不是两个)之一。检查Items表上的约束将完成这项工作。

伪代码示例:

CONSTRAINT a_eor_b CHECK 
    (
    NOT (a_id IS NULL AND b_id IS NULL) 
    AND NOT (a_id IS NOT NULL AND b_id IS NOT NULL) 
) 

AB是一个更一般类型的不相交的子类型。

我们称之为refs

CREATE TABLE refs (type CHAR(1) NOT NULL, id INT NOT NULL, PRIMARY KEY (type, id), CHECK (type IN ('A', 'B'))) 

CREATE TABLE a (type CHAR(1) NOT NULL, id INT NOT NULL PRIMARY KEY, FOREIGN KEY (type, id) REFERENCES refs (type, id) ON DELETE CASCADE, CHECK (type = 'A')) 

CREATE TABLE b (type CHAR(1) NOT NULL, id INT NOT NULL PRIMARY KEY, FOREIGN KEY (type, id) REFERENCES refs (type, id) ON DELETE CASCADE, CHECK (type = 'B')) 

CREATE TABLE items (id INT NOT NULL, type CHAR(1) NOT NULL, ref INT NOT NULL, FOREIGN KEY (type, id) REFERENCES refs) 

采用这种设计,请不要删除从AB直接:从父表refs删除代替。

我建议的补充,强制ID字段是空的,至少(或精确地可能)一个检查约束。

另外对于值NVL(A_ID,B_ID)的图和/或基于功能指标可能是有用的。使用Oracle11,您可以使用虚拟列。

Mapping Inheritance Structures,有没有提到4项技术,

  • 映射整个类层次结构一个表
  • 每个具体类映射到它自己的表
  • 每个类映射到自己的表
  • 地图类为通用表结构

,看看“2.6的COM削减策略“的专业人士&缺点。

+1

对不起,您能否解释一下这与我的问题有关? – 2010-01-19 13:17:42