2012-06-06 49 views
2

我還是PHP新手,我想知道哪種方法會更好,或者有人可能會提出更好的方法。PHP/MYSQL:存儲列表或大量表格

我有一組用戶,我必須跟蹤他們與帖子的所有交互。如果用戶點擊按鈕,它會將帖子添加到列表中,如果他們再次點擊它,它將刪除帖子,所以最好是:

有一列存儲postID的JSON數組在每個用戶的表格中(可能是數千)。

- 或 -

與每一個單獨的表保存(和帖子ID用戶ID的組合)(可能是數以百萬計),並返回所有結果,其中用戶ID的比賽?

對於這個問題,有兩個表:表A是用戶和表B是職位。我應該如何存儲用戶的所有保存的帖子?

編輯:對不起,但我沒有提到帖子會有多個用戶交互,用戶將有多個帖子的交互(多對多關係)。我認爲這會影響鮑勃的答案。

+1

B.它什麼DB是 – 2012-06-06 20:38:46

+1

用戶的表具有用戶ID(主鍵),用戶名和其他信息要存儲有關用戶。 Post的表格將有一個postID(也是主鍵)和一個來自用戶表(userID)的外鍵和消息內容。這樣你就可以跟蹤用戶發佈的所有消息。 – Bob

+0

你能告訴我們你正在使用的代碼嗎?即數據庫結構?如果我們能夠通過而不是鬆散的描述,建議會容易得多。 – ghoti

回答

2

這是一個有趣的問題!

解決方案真的取決於您的預期用例。如果每個用戶都有他們已經標記的帖子列表,並且這是您需要的所有信息,那麼將它們列爲用戶表中的字段(或者如果您使用nosql後端,一個可行的選擇,如果這是你的用例!)。傳輸時間不會有任何影響,因爲這個列表的大小無論如何都是相同的,但是在這個解決方案中,您可能會節省查找時間,因爲您只使用一個表並且dbs將進行優化以將這些信息保持在一起。

另一方面,如果您必須能夠爲所有標記過它的用戶查詢給定的帖子,那麼選項2會更好。在前一種方法中,您必須查詢所有用戶並查看每個用戶是否擁有該帖子。在這個選項中,你只需要從那裏找到所有的關係和工作。大概你會有一個user表,一個post表和一個user_post表與前兩個表的外鍵。還有其他的方法可以做到這一點,但它需要維護多個列表並每次都進行交叉檢查,這是一組昂貴的操作並且容易出錯。

請注意,後面的選項不應該阻塞'數百萬'的連接,因爲db應該針對這種快速讀取進行優化。 (專業提示:索引適當的專欄!)但是,請注意任何數據按摩。一個不必要的循環會殺死你的表現。

+0

感謝您的回答。我總是被告知列表不應該存儲在表格中。我專注於你的第一段,因爲這是我的需要。因此,將JSON數據(postID的一個編碼數組)作爲每個用戶的列/值會比擁有單獨的postID和userID組合表更好嗎? – RileyE

+0

再一次,'更好'取決於你的用例。如果不需要關係數據,那麼將其存儲爲可以在代碼中輕鬆操作的列表是更具可擴展性的。 (需要較少的數據庫工作。)但請確保這是您的用例! –

+0

嗯。那麼,這是好的和壞的。好,我的問題已經得到解答。我根據不同的答案創建了第三個表,該表存儲了用戶標識和帖子標識的組合(查詢用戶ID以獲取用戶標記的所有帖子,但我不需要它是關係/多方向的)。 – RileyE

0

我認爲保留第三張表格可能是所有的發佈狀態數據都是有意義的。

如果您的用戶界面每頁顯示50個帖子,則UI一次只需要跟蹤50個帖子。他們在你的數據庫中都有唯一的ID,所以這應該不成問題。

2

對於這個問題,有兩個表:表A是用戶,表B是帖子。我應該如何存儲用戶的所有保存的帖子?

如果每個用戶具有某種類型的(主鍵)的唯一ID,則廣告到是指用戶的唯一ID的每個柱的字段。

mysql> describe users; 
+----------+------------------+------+-----+---------+----------------+ 
| Field | Type    | Null | Key | Default | Extra   | 
+----------+------------------+------+-----+---------+----------------+ 
| id  | int(11) unsigned | NO | PRI | NULL | auto_increment | 
| email | varchar(200)  | YES |  | NULL |    | 
| username | varchar(20)  | YES |  | NULL |    | 
+----------+------------------+------+-----+---------+----------------+ 

mysql> describe posts; 
+---------+------------------+------+-----+---------+----------------+ 
| Field | Type    | Null | Key | Default | Extra   | 
+---------+------------------+------+-----+---------+----------------+ 
| id  | int(11) unsigned | NO | PRI | NULL | auto_increment | 
| user | int(11) unsigned | NO |  | NULL |    | 
| text | text    | YES |  | NULL |    | 
+---------+------------------+------+-----+---------+----------------+ 

然後獲得職位的用戶,例如:

SELECT text 
FROM posts 
WHERE user=5; 

或獲得來自特定組織中的所有帖子:

SELECT posts.text,users.username 
FROM posts,users 
WHERE post.user=users.id 
    AND users.email LIKE '%@example.com'; 
+0

嗨。這不會是用戶創建帖子的位置,而是用戶標記帖子的位置。所以,每個用戶都可以標記一個帖子。 – RileyE

+0

那麼什麼是「*用戶保存的帖子*」?他們畢竟不是用戶,而僅僅是用戶表達興趣的帖子?一個以上的用戶可以在同一篇文章中表達興趣嗎?用戶可以表達對多個帖子的興趣嗎?我收集這些問題的答案現在無關緊要,因爲您已經從這些答案中選出了一個贏家。 – ghoti