Database 多态层次数据库设计

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

我正在寻找一种高效的方法来构建能够处理以下场景的数据库模型: 模型需要处理未定义深度的层次结构,其中每个节点可以有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
|-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个子项”规则/显示顺序更新