2011-06-01 114 views
5

在我的数据库中,很多表都有'状态'字段,表示该特定实体所处的状态。我被告知应该使用查找表来处理这种事情,但我不确定确切的机制。有人能澄清这些问题吗?如何在oracle中使用LookUp表?

  1. 完整性如何维护? (即如何确保只有来自状态表的值进入其他表?)

  2. 状态名是否进入其他表或状态表中的状态ID是否进入其他表表?

回答

7

1-使用所谓的FOREIGN KEY约束来维护完整性。一个合理的方案可能有你做这两个表:

Table Name: STATE_CODE 
ID DESCRIPTION 
================= 
1 Alabama 
2 Arkansas 
... 
50 Wyoming 

Table Name: CUSTOMER 
===================== 
CUST_ID CUST_NAME CUST_STATE 
100  AAA Company   1 --they are in Alabama! 
200  ZZZ Company   50 --they are in Wyoming! 

这个回答您的问题#2:状态代码,而不是全名,走在CUSTOMER表在这个例子中。

一个典型的脚本来征收这种结构上的现有布局会是这样的:

--first, create the lookup table 
CREATE TABLE STATE_CODE(
    ID INTEGER NOT NULL 
,DESCRIPTION VARCHAR(100) NOT NULL 
,PRIMARY KEY(ID) 
); 

--now add a reference to the lookup table inside your existing table 
--the REFERENCES part will **force** entries 
--to have a matching entry in STATE_CODE 
ALTER TABLE CUSTOMER ADD STATE_CODE_ID REFERENCES STATE_CODE(ID); 

这回答您的问题#1:“参考”命令将创建一个外键约束会强制CUSTOMER.STATE_CODE中的所有条目在STATE_CODE表中具有相应的条目。

INSERT INTO CUSTOMER(CUST_ID,CUST_NAME,CUST_STATE) 
VALUES(9000,'Martians',74837483748); 

然后,他们会得到一个错误信息,而且错误的数据就永远也不会进入(当然,除非,你真的有一个状态代码:设置此功能,如果有人试图在此之后的74837483748)。

+0

非常详细的解释!谢谢! – 2011-06-01 14:04:45

2

答案:

  1. 完整性由外键约束维护。

    外键约束确保子表只允许指定列中的值来自父表的指定列。

  2. 为了加入/各种数据库操作,建议使用最小的数据类型,因为性能会更好。

    例如,INT需要4个字节,而VARCHAR2(4+)需要更多。从性能角度来看,如果使用INT比VARCHAR2(4+)更快。但是你确实需要两栏 - 一栏作为主键,另一栏作为人类可读的描述。这种方法允许您更改描述而不影响现有记录。

    这导致了关于人为/代理和自然键的讨论,最好用作主键(最终是外键)。

相关问题