簡體   English   中英

使用ORM(如ODB)時處理類更改

[英]Handling class changes when using ORM such as ODB

我正在研究使用ORM(異議關系映射器)來允許我將我的C ++對象持久化到SQLite數據庫中。 我目前正在通過CodeSynthesis考慮ODB。

請參閱: http//www.codesynthesis.com/products/odb/

看看ODB的文檔,我沒有看到一個嘮叨問題的答案,即:

如果我創建一個類,將其持久保存到數據庫中會發生什么,但隨后在我的產品的更高版本中更改該類。 當用戶獲得我的軟件的新版本時,如何將舊數據正確加載到新版本的類中?

我之前看過boost :: serialize,它有處理這種“升級”的機制,但我想知道:

  1. 一般來說,如何在ORM工具中處理這個問題?
  2. 如何使用ODB專門做到這一點
  3. 有沒有比ODB更好的ORM工具來處理這個問題?

從一開始,全面披露:我在ODB工作。 並回答你的第三個問題,不,沒有;-)。

但嚴重的是,模式演化是一個難題,它是我們TODO列表中的三大項目之一(另外兩個是多數據庫支持和SQL-to-C ++編譯器)。 好消息是我們已經完成了多數據庫支持,下一個是模式演變。

通常,最好的方法是將您的架構(以及必要的數據)帶到最新版本。 使應用程序能夠讀取多個不同版本的替代方案似乎在現實世界中似乎沒有擴展。

例如,假設我們向類中添加了一個數據成員,該數據成員在數據庫模式級別轉換為將列添加到相應的表中。 處理這個問題的方法是使這個新列成為NULL(使用odb :: nullable或boost :: optional)。 這里的想法是,沒有此列值的舊數據將為NULL(應用程序可以檢測和處理)。

接下來,我們需要升級數據庫中的模式。 在這種情況下,我們需要執行ALTER TABLE ADD COLUMN語句,該語句將添加新列。 一旦ODB支持模式演變,它將自動生成這些遷移語句。 現在你必須自己寫(痛苦,我知道)。 表中的所有現有行將自動為此列分配NULL值。

因此,通常應用程序將包含一組此類語句,用於將模式從一個版本升級到下一個版本。 例如,從1到2,從2到3等。數據庫將存儲模式版本,應用程序將知道其最新的模式版本。 打開數據庫后,應用程序將立即檢查數據庫版本,如果它低於應用程序架構版本,它將開始運行這些遷移集以將架構升級到最新版本。

如果你仍然對ODB持開放態度,你可以考慮quince: http//quince-lib.com (並且完全披露:我寫了它)。

關於升級數據類型的具體問題:quince不會自動檢測進化的需要,或設計進化策略或類似的東西。 它給你的是ALTER TABLE的C ++接口。 但從積極的方面來說:它完全處於C ++級別:您根據C ++數據類型描述了您的更改,並且它們都是靜態類型檢查的。

暫無
暫無

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

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