Database 多态层次数据库设计
我正在寻找一种高效的方法来构建能够处理以下场景的数据库模型: 模型需要处理未定义深度的层次结构,其中每个节点可以有0到3(最多)个子节点,其中每个子节点可以是5-7种不同类型中的一种 下面是一个示例树,我需要支持其中的“foo”、“bar”等。每个都是不同表中的条目,数字引用该表中的id。假设foo.1、bar.2和foo.3是顶级节点。Base只是一个虚拟对象,用于指向未知类型的顶级节点Database 多态层次数据库设计,database,database-design,relational-database,Database,Database Design,Relational Database,我正在寻找一种高效的方法来构建能够处理以下场景的数据库模型: 模型需要处理未定义深度的层次结构,其中每个节点可以有0到3(最多)个子节点,其中每个子节点可以是5-7种不同类型中的一种 下面是一个示例树,我需要支持其中的“foo”、“bar”等。每个都是不同表中的条目,数字引用该表中的id。假设foo.1、bar.2和foo.3是顶级节点。Base只是一个虚拟对象,用于指向未知类型的顶级节点 Base.1 |-foo.1 |-foo.2 |-qaz.1 |-bar.1 Base.2
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重构整个树,或者在检索后需要在代码中这样做?或者,是否有更好的方法以更高效和保证关系完整性的方式存储此类数据
每个条目都将位于不同的表中
有什么好的理由吗
单表继承是最快的,所以如果性能是您关心的问题
这将有助于:
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 )
);
然后使用toquery(避免使用MySQL/MaridDB)。使用触发器强制执行“最多3个子项”规则/显示顺序更新