【问题标题】:Inheritance in database?继承数据库?
【发布时间】:2026-02-01 10:35:02
【问题描述】:

有没有办法在数据库中使用继承(特别是在 SQL Server 2005 中)?

假设我想在我的所有实体上添加像 CreatedOnCreatedBy 这样的少数字段。我正在寻找一种替代方法,而不是将这些字段添加到每个表中。

【问题讨论】:

  • 我认为您的问题更适合表述为“在数据库中处理审计的推荐方法有哪些?”
  • 如果这是唯一的目的,我同意。但是 db-iheritance 问题是一个很好的问题

标签: sql database inheritance sql-server-2005


【解决方案1】:

SQL Server 2005 中的表之间没有继承之类的东西,正如其他人所指出的那样,您可以在创建表时获得帮助,将必要的列添加到表中,但不会如您所知的继承。

把它想象成你的源代码文件的模板。

正如 GateKiller 所提到的,您可以创建一个包含共享数据的表并使用外键引用它,但您要么必须拥有审计挂钩、触发器,要么手动进行更新。

底线:手工工作。

【讨论】:

  • 尽量不要引用其他帖子,因为它们因投票而出现故障。
【解决方案2】:

PostgreSQL 有这个特性。只需将其添加到表定义的末尾即可:

INHERITS FROM (tablename[, othertable...])

子表将拥有其父表的所有列,对父表的更改将更改子表。此外,子表中的所有内容都将出现在对父表的查询中(默认情况下)。不幸的是,索引不会跨越父/子边界,这也意味着您无法确保某些列在父子和子节点中都是唯一的。

据我所知,这不是一个经常使用的功能。

【讨论】:

  • 我认为问题是“特别是在 SQL Server 2005 中”?
【解决方案3】:

您可以在 Management Studio 的模板窗格中创建模板。然后每次要创建新表时使用该模板。

否则,您可以将 CreatedOn 和 CreatedBy 字段存储在引用原始表和 ID 的审计跟踪表中。

如果做不到,请手动执行。

【讨论】:

  • 模板不是继承
【解决方案4】:

您可以使用数据建模工具,例如 ER/Studio 或 ERWin。这两种工具都有域列,您可以在其中定义可以应用于任何表的列模板。当域发生变化时,关联的列也会发生变化。 ER/Studio 还具有触发器模板,您可以构建这些模板并将其应用于任何表。这就是我们无需构建和维护数百个触发器脚本即可更新 LastUpdatedBy 和 LastUpdatedDate 列的方式。

如果您确实创建了一个审计表,那么使用审计表的每个表中的每一行都会有一行。那可能会变得混乱。在我看来,最好将审计列放在每个表中。您可能还想在所有表中放置一个时间戳列。您永远不知道何时并发会成为问题。我们在每个表中放置的数据库审计列是:CreatedDt、LastUpdatedBy、LastUpdatedDt 和 Timestamp。

希望这会有所帮助。

【讨论】:

    【解决方案5】:

    我们有一个 SProc,它可以将审计列添加到给定的表中,并且(可选)创建历史表和关联的触发器来跟踪值的更改。不幸的是,公司政策规定我不能分享,但确实不难实现。

    【讨论】:

      【解决方案6】:

      如果您使用 GUID,您可以创建一个包含 GUID、CreatedOn、CreatedBy 列的 CreateHistory 表。为了填充表,您仍然需要为每个表创建触发器或在应用程序逻辑中处理它。

      【讨论】:

      • 如果你只有 GUID,你怎么知道它来自哪个表?
      【解决方案7】:

      您不想使用继承来执行此操作!当表 B、C 和 D 继承自表 A 时,这意味着查询表 A 会得到来自 B、C 和 D 的记录。现在考虑...

      从一个中删除;

      不要继承,而是使用 LIKE...

      CREATE TABLE blah (
          blah_id     serial       PRIMARY KEY
          , something text         NOT NULL
          , LIKE template_table    INCLUDING DEFALUTS
      );
      

      【讨论】:

        【解决方案8】:

        Ramesh - 我会在我的 E-R 模型中使用超类型和子类型关系来实现这一点。您还可以通过几种不同的物理方式来实现这些关系。

        【讨论】:

          【解决方案9】:

          在 O-R 映射中,继承映射到父表,其中父表和子表使用相同的标识符

          例如

          create table Object (
              Id int NOT NULL --primary key, auto-increment
              Name varchar(32)
          )
          create table SubObject (
              Id int NOT NULL  --primary key and also foreign key to Object
              Description varchar(32)
          )
          

          SubObject 与 Object 具有外键关系。创建 SubObject 行时,必须先创建一个 Object 行,并在两行中​​使用 Id

          【讨论】: