2016-01-21 124 views
-1

我正在寻找一种有效的方法来构建可处理以下情形的数据库模型: 模型需要处理未定义深度的层次结构,其中每个节点可以有0到3(最多)每个孩子可以是5-7种不同类型的孩子。多态层次结构DB设计

以下是我需要支持的示例树,其中'foo','bar'等每个都将在不同的表中输入,并且数字引用该表中的id。假设foo.1,bar.2和foo.3是顶级节点。 Base对于我来说只是一个虚拟对象,指向未知类型的顶级节点。

Base.1 
|-foo.1 
    |-foo.2 
    |-qaz.1 
    |-bar.1 
Base.2 
|-bar.2 
    |-qaz.2 
    |-foo.2 
    |-bar.3 
Base.3 
|-foo.3 

此外,儿童的顺序必须被保持(即,它是不正常在上述的层次结构与foo.2切换qaz.2)。

从数据访问的角度来看,大多数时候我将检索从顶级对象(Base.x)继承的整个树。

的人认为我已经到目前为止定义具有多态关联的表和每个子节点类型的引用中央表,如:

BaseTable 
--------- 
BaseId (PK) 
ObjectId (FK) 

ObjectTable 
----------- 
ObjectId (PK) 
ObjectType 
OtherTableId 
BaseId (FK) gets top level parent 

FooTable 
--------- 
FooId (PK) 
Child1_ObjectId (FK) 
Child2_ObjectId (FK) 
Child3_ObjectID (FK) 
Other data fields... 

etc. for bar and qaz 

我的想法是,我可以用ObjectTable中的BaseID FK来抓取整个树,但是有没有一种通过SQL重建整个树的有效方法,还是需要在检索后在我的代码中执行该操作?或者,是否有更好的方式以更高效的方式存储这类数据并保证关系完整性?

回答

0

将是一个不同的表

是否有一个很好的理由进入?

单表继承是最快的,所以如果性能是您的关心......

这将工作:

create table foo (
    foo_id int primary key, 
    type char(1) not null, 
    parent_id int null references foo(foo_id), 
    display_order int not null default 0, 
    foo_specific_data..., 
    bar_specific_data..., 
    qux_specific_data..., 

    unique(parent_id, display_order) 
); 

然后使用recursive common table expressions查询(避免的MySQL/MaridDB)。使用触发器强制执行“最多3个子女”规则/显示订单更新