2011-02-16 64 views
2

這更多的是關於結構的問題,而不是編程語言本身。我有一個非常基本的SQL知識。SQL多值,表設計

如果您有產品的表格,並且每個產品可以有多種顏色或沒有顏色。

Table: Color 
Columns: Id, ColorName 

1, Black 
2, White 
3, Purple 
4, Red 

,然後我們有

Table: Phone 
Columns: Id, PhoneName, PhoneManf, ColorID 

如。手機表可能有一個HTC EVO,是在黑色和白色可用

這是否意味着每個手機的每種顏色將有一個記錄。 即

1, EVO, HTC, 1 
2, EVO, HTC, 2 
3, Curve, Blackberry,1 
4, Curve, Blackberry,3 

或者有一種方法,對每個電話1個記錄在彩色密鑰類似於數組?

對不起,如果這是一個非常基本的問題,我對此很新鮮,並且希望確保我開始正確。

回答

2

簡單正常化

Table: Color 
Columns: ColorId, ColorName 
Primary Key: ColorId 

// table for the many-to-many relationship 
// between Colors and Phones 
Table: PhoneColor 
Columns: PhoneId, ColorId 
Primary Key: (PhoneId, ColorId) 
Foreign Key: PhoneId 
Foreign Key: ColorId 

Table: Phone 
Columns: PhoneId, PhoneName, PhoneManfId 
Primary Key: PhoneId 
Foreign Key: PhoneManfId 

Table: PhoneManf 
Columns: PhoneManfId, PhoneManfName, PhoneManfAddress 
Primary Key: PhoneManfId 

您有關於手機一樣SKU應該去臺電話(或型號,如果你想這樣稱呼它的方式)的任何其他細節。

細則廠商應該去表PhoneManf等

2

你可以只創建另一個表:

Table: PhoneColor 
Columns: PhoneId, ColorId 
3

複製必需的數據(如手機型號和製造商),只是因爲它是在其他顏色可供選擇是不必要的冗餘。

更好地創建一個表像phone_color (IdPhone, IdColor)

+0

在現實世界中,數據庫是由人誰不知道正常化的原則設計的,而是由球員誰剛纔一直在該公司20年並知道「生意」。現在開始使用蹩腳的數據庫佈局纔是正確的,所以他有真實世界的經驗! – corsiKa 2011-02-16 16:13:19

+0

@ glowcoder是的,我不幸很意識到這一點。我們正處於爲期兩個月的重構過程中,因爲某些[包含憤怒]的人[/包含憤怒]決定將數據庫記錄複製爲開始日期而不是在單個記錄中使用兩個字段。 – mdrg 2011-02-16 16:25:30

0

我會做的是創建一個名爲phone_color與手機一列,另一個用於顏色的橋接表。這些列存儲映射多對多關係的相應ID。

所以上面給出的橋接表的行中的數據將是

1,1 
2,2 
3,1 
4,3 

希望有所幫助。