如何在Oracle中使用LookUp表?

| 在我的数据库中,许多表都有\'State \'字段,表示该特定实体所处的状态。有人告诉我,对于这种情况,我们应该使用Lookup表,但是我不确定确切的机制。有人可以澄清这些观点吗? 如何保持完整性? (即,如何确保只有状态表中的值才进入其他表中?) 状态名称是否进入其他表,或者状态表中的状态ID进入其他表?     
已邀请:
        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的代码)。     
        答案: 完整性是由外键约束保持的。 外键约束可确保子表在指定列中仅允许来自父表的指定列的值。 为了进行联接/各种数据库操作,建议使用尽可能小的数据类型,因为这样会提高性能。 例如,INT占用4个字节,而VARCHAR2(4+)占用更多字节。从性能的角度来看,如果您使用INT,它将比VARCHAR2(4+)更快。但是您确实希望两列-一列用作主键,而另一列是易于阅读的描述。这种方法使您可以在不影响现有记录的情况下更改描述。 这导致了关于人工/代理密钥和自然密钥的讨论,关于什么最好用作主密钥(最终用作外键)。     

要回复问题请先登录注册