2015-04-26 42 views
1

我有一個像這樣的表,其中包含添加到數據庫的項目。表中的引用

編目表例如

id | element | catalog 
0 | mazda | car 
1 | penguin | animal 
2 | zebra | animal 

等....

然後,我有當用戶從該表中選擇項的表,我一直選擇了什麼樣的參考這樣

用戶表例如

id | name | age | itemsSelected 
0 | john | 18 | 2;3;7;9 

所以我想說的是,我把什麼用戶已經選擇了,就好像ID的一個字符串的引用,但我覺得這似乎麻煩

因爲當我做一個查詢以獲得一點點關於用戶的信息,我得到的是字符串2;3;7;9,當我真正想要的是與這些ID相對應的項目的數組

現在我得到ID的,我必須拆分字符串,然後運行另一個查詢找到ID對應的元素

有沒有更簡單的方法來做到這一點,如果我的問題是理解竹葉提取?

回答

2

是的,有一種方法可以做到這一點。您創建了第三張包​​含A/B地圖的表格。它被稱爲多對多外鍵關係。

你有你的目錄(int, varchar(MAX), varchar(MAX))或類似的。

你有你的用戶(int, varchar(MAX), varchar(MAX), varchar(MAX))或相似,本質上,除去最後一列,然後創建另一個表:

您創建一個UserCatalogue表:(int UserId, int CatalogueId)與兩列的Primary Key。然後用戶ID列獲得外鍵到User.Id,並且目錄表得到外鍵到Catalogue.Id。這保留了關係並簡化了查詢。這也意味着如果Catalogue.Id數字22不存在,您不能意外插入它作爲兩者之間的關係。 這被稱爲參照完整性。的SQL服務器的任務,如果你說,「必須這個其他表的引用」,那麼SQL Server將強制要求關係

創建完成後,爲每個itemsSelected添加一個條目:I.e.

UserId | CatalogueId 
0  | 2 
0  | 3 
0  | 7 
0  | 9 

這也alows您對錶使用JOIN S表示更快查詢。


此外,與無關的問題,你還可以優化Catalogue表,你有一點,並創建另一個表CatalogueGroup,其中包含你的最後一列有(catalog汽車動物 ),它是通過引用的外鍵關係在當前的Catalogue表中定義的。這也將保存存儲空間和加快SQL Server的工作,因爲它不再需要閱讀string列,如果你只想要element值。