ara*_*ash 0 mysql database data-modeling object-oriented-analysis object-oriented-database
假设我们有三个概念如下:
概念(attribute1,attribute2,..)
A(a,b,c,d)
B(a,b,c,d,e)
C(a,b,c,d,f)
在数据库中为这三个概念建模有三种选择:
1)按原样对它们进行建模
表{column1,column2,...}
A {id,a,b,c,d}
B {id,a,b,c,d,e}
C {id,a,b,c,d,f}
Con:存在数据冗余.
2)在一个表中建模
A {id,object_type,a,b,c,d,e,f}
Con:对于某些概念,某些字段仍为空.
3)使用表之间的关系
一个{parent_id,a,b,c,d}
B {id,parent_id,e}
C {id,parent_id,f}
Con:增加查询复杂性以连接表.
你会用哪种方法?你有其他解决方案吗?你认为第三种方法的性能较差吗?
显然,你的选择1是最糟糕的选择.这里的主要问题是,你需要复制的所有行B和C中A,从而创造一个严重的问题,维护.
您的选项2称为单表继承模式,建议在子表没有(m)任何其他列的情况下使用.
您的选项3称为连接表继承模式,其中子表(表示子类)通过其主键(也是引用超级表的外键)连接到它们的超级表.
所以,你抽象的例子的情况下,似乎选项2是推荐的方法,因为你的表B和C只有一个附加列.
请注意,根据连接表继承的方式,没有必要添加一个主键属性(像你一样用id的B和C).您只需使用与supertable相同的原始键,并使其成为引用超级表的外键.因此,在这种方法中,架构将是
A { id PK,
a, b, c, d
}
B { id PK REFERENCES A,
e
}
C { id PK REFERENCES A,
f
}
Run Code Online (Sandbox Code Playgroud)
您可以在关于使用类层次结构开发前端Web应用程序的教程的子数据库表的子类型和继承一节中阅读有关此内容的更多信息.