-
09-09-2019 - |
题
在设计数据库时,我经常听到有关子类型化表的信息,并且我完全了解它们背后的理论。然而,我从未真正见过表子类型的实际应用。如何创建表的子类型?我正在使用 MS Access,并且正在寻找一种在 SQL 中以及通过 GUI (Access 2003) 执行此操作的方法。
干杯!
解决方案
一个简单的例子是有一个包含主键的 Person 表和该表中的一些列。现在您可以创建另一个名为 Student 的表,该表具有指向 person 表(其超类型)的外键。现在学生表有一些父类型没有的列,如 GPA、专业等。但姓名、姓氏等将位于父表中。您始终可以通过 Student 表中的外键访问 Person 表中的学生姓名。
无论如何,请记住以下几点:
- 层次结构描述了超类型和子类型之间的关系
- 超类型具有共同的属性
- 子类型具有独特的属性
其他提示
表的子类型是 EER 图中的一个概念。我还没有看到直接支持它的 RDBMS(不包括对象关系 DBMS)。它们通常在以下任一版本中实现:
- 单个表中子类型的每个属性的一组可为空的列
- 使用基本类型属性表和其他一些表,每个基本表最多一行将包含子类型属性
表的子类型的概念使用ORM映射器,以产生类子类型层次结构时是有用的准确模型的域。
一个子类型的表将具有两个外键回到它的父这也是子类型表的主键。
请记住,在设计一个绑定的应用程序,如Access应用程序,亚型带来沉重的成本方面的连接。
例如,如果你有三个亚型的表的超类型表和需要显示在一个单一的形式一次全部三个(和需要显示不只是超型日期),则结束了使用的选择三个外连接和NZ(),或者你需要一个UNION ALL的三个互相独立的SELECT语句(每个亚型)。这些都不将可以编辑。
我要粘贴的第一大应用,在那里我与超/子表工作的一些SQL,但是看着它时,SQL是如此复杂,它只是迷惑人。这与其说是因为我的应用程序是复杂的,但它是由于问题的性质是复杂的 - 呈现全套数据的用户,无论是超和亚型,是由于其本身的性质复杂。从它的工作,我的结论是,我会一直关闭,只有一个亚型表更好。
这并不是说这不是在某些情况下非常有用,只是进入的结合形式并不一定可以很容易将这些数据提供给用户。
我也有类似的问题,我一直在工作。
在寻找一个可重复的模式,我想确保我没有放弃参照完整性,这意味着我不会用(TABLE_NAME,PK_ID)解决方案。
我最终选择:
基类型表:CUSTOMER
子类型的表:个人,企业,GOVT_ENTITY
我把可空PRERSON_ID,BUSINESS_ID和客户GOVT_ENTITY_ID领域,在每个外键和检查约束,只有一个不为空。可以很容易地添加新的子类型,只需要添加可空外键和修改检查约束。