簡體   English   中英

Inheritance 在數據庫中?

[英]Inheritance in database?

有什么方法可以在數據庫中使用 inheritance(特別是在 SQL Server 2005 中)?

假設我有幾個像CreatedOnCreatedBy這樣的字段,我想將其添加到我的所有實體上。 我正在尋找一種替代方法,而不是將這些字段添加到每個表中。

SQL Server 2005 中的表之間沒有 inheritance 這樣的東西,正如其他人所指出的那樣,您可以獲得幫助,在創建表時將必要的列添加到表中,但它不會是 Z7FED3411FAF028B21知道。

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

正如 GateKiller 所提到的,您可以創建一個包含共享數據的表並使用外鍵引用它,但您要么必須擁有審計掛鈎、觸發器,要么手動進行更新。

底線:手工作業。

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

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

子表將擁有其父表的所有列,對父表的更改將更改子表。 此外,子表中的所有內容都將出現在對父表的查詢中(默認情況下)。 不幸的是,索引不會跨越父/子邊界,這也意味着您無法確保某些列在父子和子節點中都是唯一的。

據我所知,這不是一個經常使用的功能。

如果您使用 GUID,您可以創建一個包含 GUID、CreatedOn、CreatedBy 列的 CreateHistory 表。 為了填充表,您仍然必須為每個表創建觸發器或在應用程序邏輯中處理它。

您可以在 Management Studio 的模板窗格中創建一個模板。 然后每次要創建新表時使用該模板。

否則,您可以將 CreatedOn 和 CreatedBy 字段存儲在引用原始表和 ID 的審計跟蹤表中。

做不到這一點,手動做。

您可以使用數據建模工具,例如 ER/Studio 或 ERWin。 這兩種工具都有域列,您可以在其中定義可以應用於任何表的列模板。 當域發生變化時,關聯的列也會發生變化。 ER/Studio 還具有觸發器模板,您可以構建這些模板並將其應用於任何表。 這就是我們無需構建和維護數百個觸發器腳本即可更新 LastUpdatedBy 和 LastUpdatedDate 列的方式。

如果您確實創建了一個審計表,那么使用審計表的每個表中的每一行都會有一行。 那可能會變得混亂。 在我看來,最好將審計列放在每個表中。 您可能還想在所有表中放置一個時間戳列。 您永遠不知道何時並發會成為問題。 我們在每個表中放置的數據庫審計列是:CreatedDt、LastUpdatedBy、LastUpdatedDt 和 Timestamp。

希望這可以幫助。

我們有一個 SProc,它將審計列添加到給定的表中,並且(可選地)創建一個歷史表和關聯的觸發器來跟蹤對值的更改。 不幸的是,公司政策意味着我不能分享,但這確實不難實現。

您不想使用 inheritance 來執行此操作,當表 B、C 和 D 繼承自表 A 時,這意味着查詢表 A 將為您提供來自 B 的記錄。Z0D61F8370CAD1D412F8370B84D143E 現在考慮...

從一個中刪除;

代替 inheritance,使用 LIKE 代替...

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

Ramesh - 我將在我的 ER model 中使用超類型和子類型關系來實現這一點。 您也有一些不同的物理選擇來實現這些關系。

在 OR 映射中,inheritance 映射到父表,其中父表和子表使用相同的標識符

例如

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM