子类型化数据库表

时间:2009-04-15 00:38:18

标签: sql ms-access database-design subtype

我在设计数据库时听到很多关于子表格的信息,我完全了解它们背​​后的理论。但是,我从未真正看到表格子类型在行动。如何创建表的子类型?我正在使用MS Access,我正在寻找一种在SQL和GUI(Access 2003)中实现它的方法。

干杯!

5 个答案:

答案 0 :(得分:10)

一个简单的例子是让Person表具有主键和该表中的一些列。现在,您可以创建另一个名为Student的表,该表具有person表的外键(其超类型)。现在学生表中有一些超类型没有像GPA,Major等那样的列。但名称,姓氏等都在父表中。您始终可以通过Student表中的外键在Person表中访问学生姓名。

无论如何,请记住以下内容:

  • 层次结构描述了超类型和子类型之间的关系
  • 超类型具有共同属性
  • 子类型具有唯一属性

答案 1 :(得分:1)

表的子类型是EER图中的概念性事物。我还没有看到直接支持它的RDBMS(不包括对象关系DBMS)。它们通常用

实现
  1. 单个表中子类型的每个属性的一组可为空的列
  2. 使用基表类型属性表和一些其他表,每个基表最多一行将包含子类型属性

答案 2 :(得分:1)

当使用ORM映射器生成完全模拟域的类子类型层次时,表子类型的概念很有用。

子类型表将同时具有返回其父级的外键,这也是子类型表的主键。

答案 3 :(得分:1)

请记住,在设计绑定应用程序时,与Access应用程序一样,子类型在连接方面会产生沉重的代价。

例如,如果您有一个包含三个子类型表的超类型表,并且您需要同时在一个表单中显示所有三个(并且您不仅需要显示超类型日期),您最终可以选择使用三个外连接和Nz(),或者你需要一个UNION ALL三个互斥的SELECT语句(每个子类型一个)。这些都不可编辑。

我打算从我使用超级/子类型表的第一个主要应用程序中粘贴一些SQL,但是看一下,SQL很复杂,只会让人感到困惑。这并不是因为我的应用程序很复杂,但这是因为问题的本质很复杂 - 向用户呈现完整的数据集,无论是超类型还是子类型,其本质都非常复杂。通过使用它得出的结论是,只有一个子类型表我会更好。

这并不是说它在某些情况下没用,只是Access的绑定表单不一定能够很容易地将这些数据呈现给用户。

答案 4 :(得分:1)

我有一个类似的问题,我一直在努力。

在寻找可重复的模式时,我想确保我没有放弃参照完整性,这意味着我不会使用(TABLE_NAME,PK_ID)解决方案。

我终于安定下来了:

基本类型表:CUSTOMER

子类型表:PERSON,BUSINESS,GOVT_ENTITY

我在CUSTOMER中放置了可空的PRERSON_ID,BUSINESS_ID和GOVT_ENTITY_ID字段,每个字段都有外键,以及只有一个不为空的检查约束。添加新的子类很容易,只需要添加可空的外键并修改检查约束。