我正在使用 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)
);
域表的目的是利用 sqlite 的外键约束(参照完整性)。
写入这些表的 C++ 代码不知道架构。我想知道在 C++ 中复制这些表是否是糟糕的设计。例如:
enum StatusEnum { pending, in_progress, error, complete };
我看到四个选项:
my_other_table
在不知道我插入的状态值是否有效的情况下插入。如果状态值无效,这将在运行时失败。- 使用 C++ 枚举复制 ,
status_domain
以便编译器不会让我执行无效状态的插入。这违反了 DRY 原则,因为如果架构发生更改,我将不得不在这两个地方进行更改。 - 报废
status_domain
表并让 C++ 枚举强制执行有效的数据类型。C++ 代码将是插入这些表的唯一位置,因此这似乎是合理的。然而,在模式中明确声明状态类型是很好的。 - 使 sqlite 包装器代码更加了解数据库/模式。我认为这不值得付出努力。
我倾向于选项 2,但犹豫不决,因为它存储的东西可能会在两个不同的地方发生变化。
注意:还有一些(更长的)这样的表格我没有分享。