PostgreSQL 用户定义类型枚举与外键 - 维护和性能
PostgreSQL user defined type enum vs foreign key - maintenance and performance
我正在尝试在两种方法之间做出决定,以在 PostgreSQL table.
中为用户定义的列值集
用户定义的数据类型:
CREATE TYPE track_class AS ENUM(
'Easy', 'Medium', 'Difficult', 'Very difficult', 'NA'
);
外键:
CREATE TABLE track_class (
class TEXT PRIMARY KEY
);
INSERT INTO track_class (class) VALUES ('Easy'), ('Medium'), ('Difficult'), ('Very difficult'), ('NA');
CREATE TABLE tracks (
track_class TEXT REFERENCES track_class (class) ON UPDATE CASCADE
);
从维护(稍后向域添加/编辑/替换值)and/or 性能(其中,分组依据,排序依据)的角度来看,是否有任何一个优于另一个谈论数百万条记录,或者它确实如此差别不大?
我不推荐使用枚举。在不删除类型的情况下,特别是删除枚举值是不可能的。
我想在建模方面非常容易处理并且最好的是您提到的带有外键的新 table。如果在外键列上放置索引,性能应该没问题。
另一种选择是使用 CHECK
-约束:
ALTER TABLE mytable
ADD CONSTRAINT myconstraint_only_some_values
CHECK (mycolumn IN ('Easy', 'Medium', 'Difficult', 'Very difficult', 'NA'));
也许这在您的数据中 "visible" 更多,您不必考虑加入。如果您没有忘记 mycolumn
上的索引,此版本应该与具有外键的版本一样高效。
我正在尝试在两种方法之间做出决定,以在 PostgreSQL table.
中为用户定义的列值集用户定义的数据类型:
CREATE TYPE track_class AS ENUM(
'Easy', 'Medium', 'Difficult', 'Very difficult', 'NA'
);
外键:
CREATE TABLE track_class (
class TEXT PRIMARY KEY
);
INSERT INTO track_class (class) VALUES ('Easy'), ('Medium'), ('Difficult'), ('Very difficult'), ('NA');
CREATE TABLE tracks (
track_class TEXT REFERENCES track_class (class) ON UPDATE CASCADE
);
从维护(稍后向域添加/编辑/替换值)and/or 性能(其中,分组依据,排序依据)的角度来看,是否有任何一个优于另一个谈论数百万条记录,或者它确实如此差别不大?
我不推荐使用枚举。在不删除类型的情况下,特别是删除枚举值是不可能的。
我想在建模方面非常容易处理并且最好的是您提到的带有外键的新 table。如果在外键列上放置索引,性能应该没问题。
另一种选择是使用 CHECK
-约束:
ALTER TABLE mytable
ADD CONSTRAINT myconstraint_only_some_values
CHECK (mycolumn IN ('Easy', 'Medium', 'Difficult', 'Very difficult', 'NA'));
也许这在您的数据中 "visible" 更多,您不必考虑加入。如果您没有忘记 mycolumn
上的索引,此版本应该与具有外键的版本一样高效。