【问题标题】:Subtyping database tables子类型化数据库表
【发布时间】:2009-04-15 00:38:17
【问题描述】:

我在设计数据库时听到了很多关于子类型表的信息,并且我完全了解它们背​​后的理论。但是,我从未真正看到表子类型化的实际应用。如何创建表的子类型?我正在使用 MS Access,我正在寻找一种在 SQL 中以及通过 GUI (Access 2003) 执行此操作的方法。

干杯!

【问题讨论】:

    标签: sql ms-access database-design subtype


    【解决方案1】:

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

    无论如何,请记住以下几点:

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

    【讨论】:

    • 抱歉,我认为您只是在描述一个参考。您所谓的超类型表缺少类型属性!有关更好的 IMO 示例,请参阅此线程中的 CREATE TABLE Vehicles 帖子:bytes.com/groups/ms-sql/…
    • 是的,您说的是鉴别器列,这是解决相同问题的另一种方法。我很清楚这种方法。这并不意味着我的解决方案不正确。我只是想举一个简单的简单例子。在您发布的链接中,该帖子明确指出有多种方法可以对此类结构进行建模。在“数据库系统:设计、实施和管理第 6 版”一书中提到了与我发布的示例类似的示例。页。 150、151 和 159。
    • 我对上述内容的狡辩是,您应该更明确地说明 Student 表的 PK 对 Person 表的代理键具有外键约束。这样做的意义在于,Student 关系的元组没有独立于 Person 表中相应元组的身份;因此,这是一个真正的子类型关系。它不是一个参考,正如 onedaywhen 声称的那样。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      表子类型的概念在使用 ORM 映射器生成精确建模域的类子类型层次结构时很有用。

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

      【讨论】:

      • 如果子表记录和父表是1:1的关系,为什么不直接用外键做PK呢?
      【解决方案4】:

      请记住,在设计绑定应用程序时,与 Access 应用程序一样,子类型在连接方面会带来沉重的成本。

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

      我打算从我使用超级/子类型表的第一个主要应用程序中粘贴一些 SQL,但是看着它,SQL 太复杂了,只会让人们感到困惑。这并不是因为我的应用程序很复杂,而是因为问题的性质很复杂——向用户呈现完整的数据集,包括超类型和子类型,本质上是复杂的。我使用它的结论是,我最好只使用一个子类型表。

      这并不是说它在某些情况下没有用,只是 Access 的绑定表单不一定可以轻松地将这些数据呈现给用户。

      【讨论】:

        【解决方案5】:

        我一直在处理一个类似的问题。

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

        我终于决定了:

        基本类型表:客户

        子类型表:PERSON、BUSINESS、GOVT_ENTITY

        我将可为空的 PRESSON_ID、BUSINESS_ID 和 GOVT_ENTITY_ID 字段放在 CUSTOMER 中,每个字段上都有外键,并且只有一个不为空的检查约束。添加新的子类型很容易,只需要添加可为空的外键并修改检查约束即可。

        【讨论】:

          猜你喜欢
          • 2011-12-05
          • 1970-01-01
          • 1970-01-01
          • 2012-08-28
          • 2011-07-24
          • 2012-10-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多