数据库中的继承?

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

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

0
额外 作者 jpalecek,
我认为你的问题会更恰当地表述为“在数据库中处理审核的一些推荐方法是什么?”
额外 作者 Michael Brown,
如果这是唯一的目的,我同意。但分贝问题是一个很好的问题
额外 作者 Steven A. Lowe,

9 答案

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

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

如果没有,请手动完成。

0
额外
模板不是继承
额外 作者 Steven A. Lowe,

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

0
额外

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

把它看作更像源代码文件的模板。

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

底线:手动工作。

0
额外
尽量不要引用另一个帖子,因为他们由于投票而失序。
额外 作者 Michael Brown,

PostgreSQL有这个功能。只需将它添加到表定义的末尾即可:

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

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

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

0
额外
我认为这个问题'特别在SQL Server 2005'中?
额外 作者 Steven A. Lowe,

在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

0
额外

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

0
额外
如果你拥有的只是GUID,你怎么知道它来自哪个表?
额外 作者 Steven A. Lowe,

你不想使用继承来做到这一点!当表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
);
0
额外

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

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

希望这可以帮助。

0
额外

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

0
额外