有什麼辦法可以在數據庫中使用繼承(特別是在SQL Server 2005中)?數據庫中的繼承?
假設我有幾場像CreatedOn,CreatedBy,我想我所有的實體的補充。我正在尋找替代方法,而不是將這些字段添加到每個表。
有什麼辦法可以在數據庫中使用繼承(特別是在SQL Server 2005中)?數據庫中的繼承?
假設我有幾場像CreatedOn,CreatedBy,我想我所有的實體的補充。我正在尋找替代方法,而不是將這些字段添加到每個表。
SQL Server 2005中的表之間沒有這樣的繼承關係,正如其他人所指出的那樣,只要在創建它們時獲得必要的列添加到表中,但它不會如你所知,繼承。
認爲它更像是源代碼文件的模板。由於GateKiller提到,您可以創建一個包含共享數據的表並使用外鍵引用它,但是您必須具有審覈掛鉤,觸發器或手動執行更新。
底線:手動工作。
您可以在Management Studio的模板窗格中創建模板。然後每次你想創建一個新表時使用該模板。
如果失敗,您可以將CreatedOn和CreatedBy字段存儲在引用原始表和id的審計跟蹤表中。
如果失敗,請手動完成。
模板不是繼承 – 2008-09-19 04:10:39
PostgreSQL具有此功能。只需添加到您的表定義的末尾:
INHERITS FROM (tablename[, othertable...])
子表將其父的所有列,並更改父表將改變孩子。此外,子表中的所有內容都將在父表中進行查詢(默認情況下)。不幸的是,索引不會跨越父/子邊界,這也意味着您無法確定父母和子女中的某些列是唯一的。
據我所知,這不是一個經常使用的功能。
我想這個問題說'具體在SQL Server 2005' ? – 2008-09-18 01:46:21
您可以使用數據建模工具,如ER/Studio或ERWin。這兩種工具都有域列,您可以在其中定義可應用於任何表的列模板。當域更改時,關聯的列也是如此。 ER/Studio還具有可以構建並應用於任何表格的觸發器模板。這是我們如何更新LastUpdatedBy和LastUpdatedDate列而無需構建和維護數百個觸發器腳本。
如果您確實創建了審計表,那麼每個使用審計表的表中的每行都應該有一行。這可能會變得混亂。在我看來,你最好把審計專欄放在每張表格中。您也可能希望在所有表格中放入時間戳列。你永遠不知道何時發生併發問題。我們在每個表中放入的數據庫審計列是:CreatedDt,LastUpdatedBy,LastUpdatedDt和Timestamp。
希望這會有所幫助。
我們有一個SProc,它將審計列添加到給定的表,並(可選)創建歷史記錄表和關聯的觸發器來跟蹤對值的更改。不幸的是,公司政策意味着我無法分享,但實現起來並不難。
如果您使用的是GUID,則可以創建一個CreateHistory表,其中包含GUID,CreatedOn,CreatedBy列。爲了填充表格,您仍然必須爲每個表格創建觸發器或在應用程序邏輯中處理它。
你不想使用繼承來做到這一點!當表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
);
拉梅什 - 我會實現這個使用超類型和子類型關係,我的E-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
我認爲你的問題會被更恰當地表述爲「在數據庫中處理審計的一些推薦方法是什麼?」 – 2008-09-17 19:29:52
如果這是唯一的目的,我同意。但db-iheritance問題是一個很好的問題 – 2008-09-18 01:47:01
真實:http://stackoverflow.com/questions/386652/techniques-for-database-inheritance – jpalecek 2010-08-26 12:18:06