【发布时间】:2025-12-04 07:10:02
【问题描述】:
我正在使用 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,但犹豫不决,因为它存储的东西可能会在两个不同的地方发生变化。
注意:还有一些类似的(更长的)表格我没有分享。
【问题讨论】: