3

我想聽取人們對最佳實踐的意見。使用外鍵定義表或在代碼中使用常量?

更好的做法是使用外鍵定義表或在代碼中使用常量?

的情況是, 有一個名爲「汽車」 「汽車」表有一個稱爲「大小」 列只有2個可能值「大小」。 '大'和'小' 這是不太可能的,會有新的價值大小。例如'MEDIUM'不需要。因此,不需要管理大小。

前進的兩種方法是: 1)製作一個名爲'car_types'的表,並將BIG和SMALL分爲兩行。然後在「汽車」表中添加一個外鍵。

2)具有 常量CAR_SIZE_BIG = '大' 常量CAR_SIZE_SMALL =在類 '小' 。 然後,'car'表中'size'列的類型爲VARCHAR(10)。 它存儲'大'或'小'

據我所知,選項2沒有標準化。但是,哪個是更好的方法呢?

謝謝。 打開您的反饋意見。

+1

相關問題:[外鍵與檢查約束的完整性](http://stackoverflow.com/questions/9347756/foreign-key-vs-check-constraint-for-integrity/) – 2012-04-19 06:08:59

回答

3

選項之一是因爲與選項2的問題,更好的是,這是完全合法的,給人一種汽車「edster」

INSERT INTO car 
(Car_size, color) 
Values 
('edster', 'red') 

對於選項1,你不能這樣做的規模(不含第一插槽進入car_size表)

該插入將無法做任何事

INSERT INTO car 
(Car_size_id, color) 
SELECT 
    car_size_id , 'red' 
FROM 
    car_size 
WHERE 
    car_size.name = 'edster' 

而且假設你car_size表只包含兩個記錄,這將失敗一個約束錯誤

INSERT INTO Car 
(Car_size_id, color) 
Values 
(3,'red') 

使用FK還有其他優點(例如,很容易將標籤BIG更改爲GRANDE,單獨從數據庫中明確定義可能的值集合等),但在這種情況下它們可能無關緊要。

+0

我喜歡你的答案。所以你在確認選項1的建議?你能否澄清你寫的INSERT有什麼問題?只是爲了給出一些原因,爲什麼這是錯的?然後我會選擇你的交友:) – edster 2012-04-19 07:09:03

+0

我希望澄清爲什麼我會在這種情況下使用選項1。但是,如果你真的只有兩個car_types並且使用了Varchar(10),那麼它可能不會是世界末日 – 2012-04-19 14:43:00

3

選項1,它將所有數據定義保留在數據庫層中。