2014-10-16 55 views
0

我帮朋友设计了一个数据库,但我很好奇,如果有拇指以下一般规则:当用一个ID替换数据库列,而不是

TABLE_ORDER

  • ORDERNUMBER
  • 订单类型

列订单类型具有从订单类型的预设列表到来的可能性。我应该允许在OrderType列中使用VARCHAR值(例如生产订单,销售订单等等)还是应该将它分隔到另一个表中,并将其引用为外键而不是TABLE_ORDER,如下所示?:

TABLE_ORDER

  • ORDERNUMBER
  • OrderTypeID

TABLE_ORDER_TYPE

  • ID
  • 订单类型

回答

1

如果订单类型列表设置,并且不会改变,你可以选择不要,让一个单独的表。但在这种情况下,请勿使其成为VARCHAR,而是将其设为ENUM

您可以更好地为此编制索引,并且最终可以得到与使用查找表进行编号时相同类型的数据库。

但是,如果有任何变化,你需要添加类型,只需要第二个。您可以在以后添加界面,但你可以很容易地使“让所有类型的”之类的网页等

0

在一个完美的世界里,可以包含重复数据应该是一个ID或ENUM任何列。这有助于确保数据始终在内部一致,并且可以减少数据库大小并加快查询速度。

对于像这样的结构,我可能会创建一个master_object表,您可以使用多种类型的表。 OrderType将引用master_object表。然后,您可以使用相同的表格来处理其他数据。例如,假设您有另一个表格 - Payments,并带有一列PaymentType。您可以使用master_object表来存储该列的值和元数据。这不需要强制你创建一堆小表,每个小表包含2-10行,这给了你相当大的灵活性。

布赖恩

+0

你的第一段是离开墙。使用“id”和“ENUM”隐含的数据完整性约束可以在没有这些条件的情况下很好地实现。以这种方式取代每一个重复的专栏甚至不可能更不用说“完美”或者甚至是合理的。 – sqlvogel 2014-10-17 15:09:35

1

我会说使用另一台说“ReferenceCodes”,例如:

类型,名称,描述,代码

然后,你可以使用代码通过了数据库和必要性不用担心与该代码关联的名称。如果您使用的名称(在您的案例订单类型),如果是真的很难后来改名字。这是我们在系统中实际做的。

0

如果列表很小(少于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表格可能会混淆你的模型,但是你的开发者的意思是清楚的(最终目标)。

相关问题