【发布时间】:2009-04-15 00:38:17
【问题描述】:
我在设计数据库时听到了很多关于子类型表的信息,并且我完全了解它们背后的理论。但是,我从未真正看到表子类型化的实际应用。如何创建表的子类型?我正在使用 MS Access,我正在寻找一种在 SQL 中以及通过 GUI (Access 2003) 执行此操作的方法。
干杯!
【问题讨论】:
标签: sql ms-access database-design subtype
我在设计数据库时听到了很多关于子类型表的信息,并且我完全了解它们背后的理论。但是,我从未真正看到表子类型化的实际应用。如何创建表的子类型?我正在使用 MS Access,我正在寻找一种在 SQL 中以及通过 GUI (Access 2003) 执行此操作的方法。
干杯!
【问题讨论】:
标签: sql ms-access database-design subtype
一个简单的例子是有一个带有主键的 Person 表和该表中的一些列。现在您可以创建另一个名为 Student 的表,该表具有 person 表(其超类型)的外键。现在学生表有一些超类型没有的列,如 GPA、Major 等。但名称、姓氏等将在父表中。您始终可以通过 Student 表中的外键访问 Person 表中的学生姓名。
无论如何,请记住以下几点:
【讨论】:
表的子类型是 EER 图中的概念性事物。我还没有看到直接支持它的 RDBMS(不包括对象关系 DBMS)。它们通常在任一实现
【讨论】:
表子类型的概念在使用 ORM 映射器生成精确建模域的类子类型层次结构时很有用。
子类型表将有一个外键返回其父级,这也是子类型表的主键。
【讨论】:
请记住,在设计绑定应用程序时,与 Access 应用程序一样,子类型在连接方面会带来沉重的成本。
例如,如果您有一个包含三个子类型表的超类型表,并且您需要同时在一个表单中显示所有三个(并且您需要显示的不仅仅是超类型日期),您最终可以选择使用三个外连接和 Nz(),或者您需要一个由三个互斥 SELECT 语句组成的 UNION ALL(每个子类型一个)。这些都不可编辑。
我打算从我使用超级/子类型表的第一个主要应用程序中粘贴一些 SQL,但是看着它,SQL 太复杂了,只会让人们感到困惑。这并不是因为我的应用程序很复杂,而是因为问题的性质很复杂——向用户呈现完整的数据集,包括超类型和子类型,本质上是复杂的。我使用它的结论是,我最好只使用一个子类型表。
这并不是说它在某些情况下没有用,只是 Access 的绑定表单不一定可以轻松地将这些数据呈现给用户。
【讨论】:
我一直在处理一个类似的问题。
在寻找可重复模式时,我想确保我没有放弃参照完整性,这意味着我不会使用 (TABLE_NAME, PK_ID) 解决方案。
我终于决定了:
基本类型表:客户
子类型表:PERSON、BUSINESS、GOVT_ENTITY
我将可为空的 PRESSON_ID、BUSINESS_ID 和 GOVT_ENTITY_ID 字段放在 CUSTOMER 中,每个字段上都有外键,并且只有一个不为空的检查约束。添加新的子类型很容易,只需要添加可为空的外键并修改检查约束即可。
【讨论】: