如何在oracle中使用LookUp表?

时间:2011-06-01 03:58:33

标签: sql oracle lookup-tables

在我的数据库中,许多表都有'State'字段,表示该特定实体所处的状态。我被告知我们应该使用Lookup表来处理这类事情,但我不确定机制。有人可以澄清这些观点吗?

  1. 如何保持诚信? (即如何确保只有状态表中的值进入其他表?)

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

2 个答案:

答案 0 :(得分: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:“REFERENCES”命令将创建一个外键约束,该约束将强制CUSTOMER.STATE_CODE中的所有条目在STATE_CODE表中具有相应的条目。设置完成后,如果有人试试这个:

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

然后他们会得到一条错误信息,并且永远不会输入有缺陷的数据(当然,除非您确实拥有代码为74837483748的状态)。

答案 1 :(得分:2)

数目:

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

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

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

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

    这导致讨论人工/代理和自然键,最好用作主键(最终用作外键)。