2010-12-08 111 views
0

我有一個存儲用戶信息的表用戶 - 如姓名,出生日期,地點日期等關係數據庫設計(MySQL的)

我還創建了一個鏈接表稱爲User_Options - 用於存儲的目的多值屬性 - 這基本上存儲複選框選擇。

我有一個前端形式供用戶填寫並創建他們的用戶配置文件。下面是我創建生成的複選框選項表:

 
Table User_Attributes 
===================== 
id attribute_name 
--------------------- 
1  Hobbies 
2  Music 
 
Table User_Attribute_Options 
====================================== 
id user_attribute_id option_name 
-------------------------------------- 
1  1     Reading 
2  1     Sports 
3  1     Travelling 
4  2     Rock 
5  2     Pop 
6  2     Dance 

所以,前端表格上有兩套複選框選項 - 對於愛好一套和音樂一組。

而這裏是在用戶表:

 
Table User 
======================== 
id name   age 
------------------------ 
1  John   25 
2  Mark   32 
 
Table User_Options 
================================================== 
id user_id   user_attribute_id  value 
-------------------------------------------------- 
1  1    1      1 
2  1    1      2 
3  1    2      4 
4  1    2      5 
5  2    1      2 
6  2    2      4 

(在上表中「user_attribute_id」是父屬性和「價值」的ID是屬性選項的ID)。

所以我不確定我是否正確或有效地完成了所有這些工作。我知道有一種在同一個表中存儲分層數據的方法,但我更願意將事物分開。

我主要關注的是User_Options表 - 這個背後的想法是,只需要一個鏈接表來存儲多值屬性,而不是每個多值屬性都有一個表。

回答

1

我只能看到我會改變的是,在關聯表User_Options中,您有一個似乎無法達到目的的ID。該表的主鍵是所有三列,我不認爲你會引用用戶具有的id選項 - 您將通過user_id/user_attribute_id獲取它們。例如,給我所有的用戶選項,其中用戶是1,用戶屬性ID是2.使用附加字段唯一鍵入這些記錄似乎是無關緊要的。

我認爲,否則表格和他們的關係的一般形狀看起來是正確的。

1

您的工作方式沒有任何問題。

以更多鏈接表引用(以及查詢的組合)的價格使事物更具可擴展性成爲可能。也可以讓事情變得更平坦,可擴展性和靈活性更低,但查詢速度會更快。

但是,通常情況下,有多種方法可以做到這一點。