我正在使用sqlite數據庫將結果存儲在嵌入式C++應用程序中。可以在應用程序代碼中複製數據庫數據嗎?
我有幾個單列表,我稱之爲「域」表,其他表中的列引用它們作爲外鍵。這些實質上是枚舉類型的表,它們只在初始化時更改一次。例如,一個表,用於存儲狀態數據類型:
CREATE TABLE status_domain (status TEXT PRIMARY KEY NOT NULL UNIQUE);
INSERT INTO status_domain VALUES ('pending');
INSERT INTO status_domain VALUES ('in_progress');
INSERT INTO status_domain VALUES ('error');
INSERT INTO status_domain VALUES ('complete');
.
.
CREATE TABLE my_other_table (
.
.
status TEXT NOT NULL,
.
.
FOREIGN KEY (status) REFERENCES status_domain(status)
);
域表的目的是要利用源碼的外鍵約束(參照完整性)。
寫入這些表的C++代碼沒有模式意識。我想知道如果用C++複製這些表是不好的設計。例如:
enum StatusEnum { pending, in_progress, error, complete };
我看到四個選項:
- 插入
my_other_table
不知道,我在插入的狀態值是否有效。如果狀態值無效,這將在運行時失敗。 - 用C++枚舉複製
status_domain
,以便編譯器不會讓我執行無效狀態的插入。這違反了DRY原則,因爲如果模式更改,我將不得不在兩個地方進行更改。 - 廢棄
status_domain
表,並讓C++枚舉實施有效數據類型。 C++代碼將是插入這些表的唯一地方,所以這看起來很合理。但是,在架構中明確聲明狀態類型是很好的。 - 使sqlite包裝器代碼更感知數據庫/架構。我不認爲這是值得的。
我傾向於選項2,但我猶豫不決,因爲它存儲的東西可能會在兩個不同的地方發生變化。
注意:還有一些這樣的表格(我沒有分享)。
我想檢查是不是具有附加表的更好,但它仍然沒有擺脫重複的問題,這是我可能必須忍受的事情。 – izak