[英]Inheritance in database?
有什么方法可以在數據庫中使用 inheritance(特別是在 SQL Server 2005 中)?
假設我有幾個像CreatedOn和CreatedBy這樣的字段,我想將其添加到我的所有實體上。 我正在尋找一種替代方法,而不是將這些字段添加到每個表中。
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.