在数据库中继承?

时间:2020-03-05 18:38:34  来源:igfitidea点击:

有什么方法可以在数据库中使用继承(特别是在SQL Server 2005中)?

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

解决方案

回答

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

失败的话,我们可以将CreatedOn和CreatedBy字段存储在引用原始表和ID的Audit Trail表中。

如果失败,请手动执行。

回答

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

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

子表将具有其父表的所有列,并且对父表的更改将更改子表。同样,子表中的所有内容都将出现在对父表的查询中(默认情况下)。不幸的是,索引不会越过父/子边界,这也意味着我们无法确保某些列在父子之间都是唯一的。

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

回答

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

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

正如GateKiller所提到的,我们可以创建一个包含共享数据的表,并使用外键对其进行引用,但是我们或者必须具有审计钩子,触发器,或者手动进行更新。

底线:手工作业。

回答

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

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

希望这可以帮助。

回答

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

回答

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

回答

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

回答

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

回答

在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