如果列表很小(少于10个项目),那么您可以选择将它建模为第一个,但是将列约束设置为将输入限制为列表中的值。这会强制条目属于您的列表,但您的列表不应该经常更改。
例如检查('Val1','Val2',...'Valn'中的order_type)
如果列表将不断变化,如果它在多个表中使用,则需要支持多种语言或任何其他设计标准这需要变化性,然后创建你的类型表(这个选择你总是安全的,这就是为什么它是最常用的)。
您可以收集所有这些表变成了“代码”表一般化的概念
CREATE TABLE Codes (
Code_Class CHARACTER VARYING(30) NOT NULL,
Code_Name CHARACTER VARYING(30) NOT NULL,
Code_Value_1 CHARACTER VARYING(30),
Code_Value_2 CHARACTER VARYING(30),
Code_Value_3 CHARACTER VARYING(30),
CONSTRAINT PK_Codes PRIMARY KEY (Code_Class, Code_Name)
);
insert into codes (code_class, code_name, code_value_1)
values('STATE','New York','NY'),
values('STATE, 'California','CA'),
....);
您可以再放置并根据变化的TABLE.COLUMN应该被限制在状态列表UPDATE/INSERT触发器。比方说,雇员表有一列EMP_STATE来存放状态短表。
触发会简单地调用像
SELECT code_name
, code_value_1
INTO v_state_name, v_state_short_name
FROM codes
WHERE code_class = 'STATE'
AND code_value_1 = new.EMP_STATE;
if(not found) then
raise(some error to fail the trigger and the insert);
end if;
这是一个select语句可以扩展到其他类型:
insert into codes (code_class, code_name)
values('ORDER_TYPE','Production'),
values('ORDER_TYPE', 'Sales'),
....);
select code_name
, code_value_1
into v_state_name, v_state_short_name
from codes
where code_class = 'ORDER_TYPE'
and code_name = 'Sales';
这最后一种方法,虽然一般适用可以使用过度。它的缺点是不能使用不同的数据类型(code_name,code_value_ *)。
一般的经验法则是:创建一个'TYPE'(例如ORDER_TYPE)表(用来保存你想要限制每种类型的属性的值),使用一个ID作为主键,使用一个序列来生成所有这样的ID(用于所有'TYPE'表)。许多TYPE表格可能会混淆你的模型,但是你的开发者的意思是清楚的(最终目标)。
你的第一段是离开墙。使用“id”和“ENUM”隐含的数据完整性约束可以在没有这些条件的情况下很好地实现。以这种方式取代每一个重复的专栏甚至不可能更不用说“完美”或者甚至是合理的。 – sqlvogel 2014-10-17 15:09:35