2014-04-27 87 views
0

我在Shop表中有許多商店,而在DB中的用戶表中有許多用戶。 用戶可以訂閱任何商店。許多商店的許多訂戶

如何爲此任務創建表?第一列與商店名稱和第二列 - 用逗號分隔的用戶id的字符串?

回答

1

這通常被稱爲多對多關係。在標準關係型數據庫中,這通常用user_idshop_id表代表,每個用戶 - >商店關係一行。

您不會希望使用逗號分隔的字符串來表示數據庫中的多個項目,因爲這會使查詢非常低效。例如,要查找用戶a訂閱的商店,您必須解析表的每一行以查找哪些逗號分隔值包含a

+0

它實際上是一個多對多的關係。一對多不需要第三個表格。 –

+0

沒錯,謝謝你 –

1

這是一個多對多的關係。你需要第三張桌子,比如叫做Subscription。這些字段將是兩個外鍵,一個引用User表的主鍵,另一個引用Shop表的主鍵。

+0

+1,整分鐘打我。 – Jimmy

0

我相信用戶可以訂閱多個商店,並且一個商店可以有多個用戶訂閱它。在這種情況下,最好使用來自商店表的shop_id和來自用戶表的user_id的地圖表。 (保持外鍵約束)。對於每個訂閱,此表將保留一個條目,因此不需要使用逗號分隔的字符串。

1

您可以創建一個表格,其中每一行表示訂閱(即一對(用戶,店鋪))。 所以,你會在表格中至少有兩列:商店的ID和用戶的ID。 假設用戶只能訂購一次商店,這個pair(user_id,shop_id)應該是表的主鍵(如果您需要爲表定義一個代理鍵,您可以添加一個唯一的約束pair(user_id,shop_id))。 如果您有許多數據並需要快速獲取用戶已訂閱的所有商店,則應該在user_id列中添加一個索引。 另一方面,如果您需要快速獲取訂閱商店的所有用戶,則應該在shop_id列中添加一個索引。

0

聽起來好像你在數據庫中有一個經典的情況,它標記了「平面文件」數據庫和「關係數據庫」(如MySQL,Oracle或MS的SQL Server)之間的變化。類似的情況是作者和書籍。一位作者可以有多本書,一些書有多個作者。

一個簡單的逗號分隔的數據庫是一個平面文件,你將需要爲每個關係單獨一行。例如,

SHOPA,用戶A ShopB,用戶A SHOPA,用戶B ShopB,用戶B

在關係數據庫中,可以隔離用戶表和商店表中兩個單獨的表,並形成一個第三表,一個關係表中描述的關係,因此在用戶和店鋪表中刪除冗餘,

ShopTable 雪巴,SA ShopB,SB

用戶表 用戶A,UA 用戶B,UB

ShopUserRelationTable SA,UA SA,UB SB,UA SB,UB

當你想顯示關係記錄,在應用SQL語言來創建序列顯示此記錄的記錄。

消除表中冗餘的這個基本問題是激發關係數據庫軟件開發的原因。

有時會發生這樣一個表,它足夠複雜以包含像這樣的「多對多」關係,SQL可以進一步應用於分析和創建反映這些關係的記錄。這樣的表格也可以用作其他表格的多對多關係表。