在数据库中继承?

时间:2008-08-08 10:41:01

标签: sql database inheritance sql-server-2005

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

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

9 个答案:

答案 0 :(得分:2)

PostgreSQL具有此功能。只需将其添加到表定义的末尾:

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

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

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

答案 1 :(得分:2)

在SQL Server 2005中没有表之间的继承,并且正如其他人所指出的那样,在创建表时,可以获得向表中添加必要列的帮助,但它不会你知道继承。

将其视为源代码文件的模板。

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

底线:手工作业。

答案 2 :(得分:0)

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

删除a;

而不是继承,请改用LIKE ......

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

答案 3 :(得分:0)

在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

答案 4 :(得分:0)

Ramesh - 我会在我的E-R模型中使用超类型和子类型关系来实现它。您也可以使用一些不同的物理选项来实现这些关系。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

如果失败,您可以将CreatedOn和CreatedBy字段存储在引用原始表和id的审计跟踪表中。

如果失败,请手动完成。

答案 8 :(得分:0)

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

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

希望这有帮助。