RDBMS概念模型在維護時間版本的數據方面不是很好。所以這不僅僅是Oracle在這方面缺乏的。
我不清楚爲什麼你認爲將版本信息保持在記錄級別會太慢。創建新版本太慢了?或者在正常運營中的數據檢索方面太慢?
這裏是你如何做到這一點。給定一個表的客戶CUSTOMER_REF的業務重點,我可能正常地構建像這樣(我用縮寫語法,而不是最佳實踐空間的原因):
create table customers
(id number not null primary key
, customer_ref number not null unique key
, name varchar2(30) not null)
/
的版本相當於是這樣的:
create table customers
(id number not null primary key
, customer_ref number not null
, version_number number
, name varchar2(30) not null
, constraint whatever unique (customer_ref, version_number))
/
這可以通過保持當前版本的VERSION_NUMBER爲空並僅在存檔時填充它來實現。任何查找將不得不包括and version_number is null
。這會有點痛苦,你可能需要在你構建的任何附加索引中包含列。
顯然,在同一個表中維護所有版本的記錄會增加表的大小,這可能會影響性能。 Oracle的分區選項在這裏絕對有幫助。它還會爲您創建明年的數據集提供一種簡潔的方式。但是,它是企業許可證之外的額外費用,因此這是一個昂貴的選擇。 Find out more.。
這最耗時的方面將是管理新版本表中的外鍵關係。假定您選擇使用合成主鍵,那麼歸檔過程必須生成新的ID,然後將它們艱苦地級聯到引用外鍵的新版本中的依賴記錄。
考慮到這一點,每個版本的謹慎表格看起來都非常有吸引力。爲了方便使用,我會保持目前的版本未加前綴,使歸檔成爲
create table customers_n as select * from customers;
一個簡單的過程,您可能希望避免的停機時間,同時創建版本表。在這種情況下,您可以使用實例化視圖在啓動歸檔切換期間捕獲表的狀態。當時鍾打到十二點時,您可以關閉刷新。 (警告:這是在飛思維,我從來沒有做過這樣的事情,所以在購買之前嘗試。)
多個表(和分區)的一個相關優點是您可以將存檔記錄移動到只讀表空間。這不僅可以防止意外更改,還可以將其排除在後續備份之外。
編輯
我注意到你有評論說,歸檔數據可以occasionbally進行修正。在將它移動到READ ONLY表空間的情況下不是更好的選擇。
來源
2010-01-22 07:54:12
APC
數據存檔後,您是否需要訪問它?你會報告一個綜合的多年期數據集嗎? – 2010-01-22 09:46:41
是的,他們的數據有時仍會被訪問(並寫入)。 – twiga 2010-01-22 10:04:09
這聽起來像你只需要將「YEAR」作爲表格設計中的一個關鍵字。會不會有一些表不會被清除,例如CUSTOMER表? – 2010-01-23 00:25:10