在我的数据库中,许多表都有“状态”字段,表示该特定实体所在的状态。有人告诉我,我们应该为这种事情使用查找表,但我不确定确切的机制。有人可以澄清这些观点吗?
如何保持完整性?(即我如何确保只有状态表中的值进入其他表?)
是状态名称进入其他表,还是状态表中的状态 ID 进入其他表?
在我的数据库中,许多表都有“状态”字段,表示该特定实体所在的状态。有人告诉我,我们应该为这种事情使用查找表,但我不确定确切的机制。有人可以澄清这些观点吗?
如何保持完整性?(即我如何确保只有状态表中的值进入其他表?)
是状态名称进入其他表,还是状态表中的状态 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+) 更快。但是您确实需要两列——一列用作主键,另一列是人类可读的描述。这种方法允许您在不影响现有记录的情况下更改描述。
这导致了关于人工/代理和自然键的讨论,什么最好用作主键(最终是外键)。