2014-04-14 150 views
0

我的疑問是什麼是最優化的。我正在建立一種「社交網絡」。用戶可以上傳:照片almbums,文件或消息。這些數據中的每一個都保存在不同的表格中。接收者保存爲他們的用戶ID,用逗號加以區分,例如:「1,2,3,4」。現在我想抓住爲用戶發送的所有內容。我有兩種方式(我知道)這樣做。優化困境

  1. 取每個表separatedly(不是很有效,因爲我必須爲每一行提取到得到另一臺德發件人用戶做一個查詢)。而隨後proccess數據。

  2. 加入3個表格。但從我的理解我不能使用LIKE加入。

任何想法?

PS:我在php和mysql中這樣做

+0

你的意思是「接收者」是什麼意思? –

+0

我不是100%確定你在問什麼,但是存儲'1,2,3,4等......'是一個可怕的想法。 – MonkeyZeus

+0

@BrianKendig發送文件/ msg/album的文件 – Fibonacci

回答

0

你想要的是一個圖形數據庫。

你可以選擇一些現成的東西或嘗試將你的圖映射到SQL數據庫。

例如是這樣的:

  • 用戶表
  • 發送器 - 接收表(二者外鍵到用戶)
  • 項目擴展表(延伸發送者 - 接收者)

東西像這樣:

CREATE TABLE user (varchar user_id, varchar email, etc...); 
CREATE TABLE link (varchar sender, varchar recepient) 
    CONSTRAINT FOREIGN KEY (sender) REFERENCES user (user_id) 
    CONSTRAINT FOREIGN KEY (recepient) REFERENCES user (user_id); 
CREATE TABLE aldbum (varchar sender, varchar recepient, album stuff) 
    CONSTRAINT FOREIGN KEY (sender, receipient) REFERENCES link (sender, recepient); 
-- repeat extension tables for files, messages 
1

您可以在JOIN中使用LIKE(請參閱how to use a like with a join in sql?),但如果我理解正確,則不應將接收者表示爲逗號分隔的字符串列表。相反,對於每個接收器項目關係使用另一個帶有單獨記錄的表格,以便您可以在不需要使用LIKE的情況下對其進行查詢。

1

您可以在join中使用like。您正在尋找的表達是這樣的:

on find_in_set(a.value, b.list) > 0 

但是,不建議這樣做,因爲MySQL不能優化使用索引的查詢性能。換句話說,列表中的項目應該是聯結/關聯表中的單獨行。

如果你需要這樣的連接,那麼你應該規範你的數據結構。這意味着,不要將列表存儲在逗號分隔的字段中。

+0

這不會導致LOT更大的數據庫嗎? – Fibonacci

+0

這是存儲此類數據的正確方法,數據庫旨在處理這些類型的問題。 –