数据库设计 – 如何处理在数据库中没有枚举字段的枚举?

在不支持枚举的数据库中如何实现枚举字段? (即SQLite)

需要使用“field =?”来容易地搜索这些字段。所以使用任何类型的数据序列化是一个坏主意。

最佳答案
使用外键查找表是我使用的方法。事实上,即使我使用支持ENUM的数据库(例如MySQL),我也使用它。

为了简单起见,我可能会跳过查找表中永久存在的“id”,并且只需在主表中使用我需要的实际值作为查找表的主键。这样你就不需要加入来获得价值。

CREATE TABLE BugStatus (
  status            VARCHAR(20) PRIMARY KEY
);

INSERT INTO BugStatus (status) VALUES ('NEW'), ('OPEN'), ('FIXED');

CREATE TABLE Bugs (
  bug_id            SERIAL PRIMARY KEY,
  summary           VARCHAR(80),
  ...
  status            VARCHAR(20) NOT NULL DEFAULT 'NEW',
  FOREIGN KEY (status) REFERENCES BugStatus(status)
);

诚然,存储字符串比MySQL的ENUM实现更多的空间,但是除非有关表有数百万行,否则几乎不重要。

查找表的其他优点是您可以使用简单的INSERT或DELETE从列表中添加或删除值,而使用ENUM可以使用ALTER TABLE重新定义列表。

还可以尝试查询ENUM中当前允许值的列表,例如在用户界面中填充选择列表。这是一个很大的烦恼!使用查找表,很容易:来自BugStatus的SELECT状态。

另外,如果需要(例如标记只对管理员可用的选项),您还可以向查找表添加其他属性列。在ENUM中,您不能注释条目;他们只是简单的价值观。

除了查找表之外的另一个选择是使用CHECK约束(如果数据库支持它们 – MySQL不会):

CREATE TABLE Bugs (
  bug_id            SERIAL PRIMARY KEY,
  summary           VARCHAR(80),
  ...
  status            VARCHAR(20) NOT NULL
    CHECK (status IN ('NEW', 'OPEN', 'FIXED'))
);

但是使用CHECK约束与ENUM相同的缺点:难以更改没有ALTER TABLE的值列表,难以查询允许值列表,难以注释值。

PS:SQL中的等式比较运算符是单个=。 double ==在SQL中没有意义。

转载注明原文:数据库设计 – 如何处理在数据库中没有枚举字段的枚举? - 代码日志