2008-08-08 74 views
8

有什麼辦法可以在數據庫中使用繼承(特別是在SQL Server 2005中)?數據庫中的繼承?

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

+0

我認爲你的問題會被更恰當地表述爲「在數據庫中處理審計的一些推薦方法是什麼?」 – 2008-09-17 19:29:52

+0

如果這是唯一的目的,我同意。但db-iheritance問題是一個很好的問題 – 2008-09-18 01:47:01

+0

真實:http://stackoverflow.com/questions/386652/techniques-for-database-inheritance – jpalecek 2010-08-26 12:18:06

回答

3

SQL Server 2005中的表之間沒有這樣的繼承關係,正如其他人所指出的那樣,只要在創建它們時獲得必要的列添加到表中,但它不會如你所知,繼承。

認爲它更像是源代碼文件的模板。由於GateKiller提到,您可以創建一個包含共享數據的表並使用外鍵引用它,但是您必須具有審覈掛鉤,觸發器或手動執行更新。

底線:手動工作。

1

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

如果失敗,您可以將CreatedOn和CreatedBy字段存儲在引用原始表和id的審計跟蹤表中。

如果失敗,請手動完成。

+0

模板不是繼承 – 2008-09-19 04:10:39

3

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

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

子表將其父的所有列,並更改父表將改變孩子。此外,子表中的所有內容都將在父表中進行查詢(默認情況下)。不幸的是,索引不會跨越父/子邊界,這也意味着您無法確定父母和子女中的某些列是唯一的。

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

+0

我想這個問題說'具體在SQL Server 2005' ? – 2008-09-18 01:46:21

0

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

如果您確實創建了審計表,那麼每個使用審計表的表中的每行都應該有一行。這可能會變得混亂。在我看來,你最好把審計專欄放在每張表格中。您也可能希望在所有表格中放入時間戳列。你永遠不知道何時發生併發問題。我們在每個表中放入的數據庫審計列是:CreatedDt,LastUpdatedBy,LastUpdatedDt和Timestamp。

希望這會有所幫助。

0

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

0

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

0

你不想使用繼承來做到這一點!當表B,C和D從表A繼承時,這意味着查詢表A將給出來自B,C和D的記錄。現在考慮...

DELETE FROM a;

而是繼承的,使用LIKE,而不是...

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

拉梅什 - 我會實現這個使用超類型和子類型關係,我的E-R型。您也可以通過幾種不同的物理選項來實現關係。

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行並在兩行中​​使用Id