在我的數據庫中,很多表都有'狀態'字段,表示該特定實體所處的狀態。我被告知應該使用查找表來處理這種事情,但我不確定確切的機制。有人能澄清這些問題嗎?如何在oracle中使用LookUp表?
完整性如何維護? (即如何確保只有來自狀態表的值進入其他表?)
狀態名是否進入其他表或狀態表中的狀態ID是否進入其他表表?
在我的數據庫中,很多表都有'狀態'字段,表示該特定實體所處的狀態。我被告知應該使用查找表來處理這種事情,但我不確定確切的機制。有人能澄清這些問題嗎?如何在oracle中使用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:「參考」命令將創建一個外鍵約束會強制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+)更快。但是你確實需要兩欄 - 一欄作爲主鍵,另一欄作爲人類可讀的描述。這種方法允許您更改描述而不影響現有記錄。
這導致了關於人爲/代理和自然鍵的討論,最好用作主鍵(最終是外鍵)。
非常詳細的解釋!謝謝! – 2011-06-01 14:04:45