2013-12-10 70 views
0

對於論壇,我想讓用戶互相發送消息給對方。 爲了做到這一點,我做了一個名爲Contacts的表格,在這個表格中我有5個collumns:user_id,一個用於存儲Friends的列表,一個用於存儲Family,一個用於存儲Business,另一個用於其他聯繫人。最後四個應該都包含一個數組,該數組包含該類型聯繫人的user_id。我選擇這個設計的原因是因爲我不想輸入很多或者限制朋友的數量,比如friend1,friend2等。將數組插入MYSQL字段

我的問題是:這是正確的嗎? ?如果不是,應該改進什麼?朋友,家人,商業和其他人應該使用哪種類型的MYSQL字段?

+0

在這裏閱讀http://www.tomjewett.com/dbdesign/dbdesign.php?page=manymany。php –

+6

糟糕的設計。如果您需要以個人身份訪問這些單獨的位,則永遠不會將多個數據存儲在單個字段中。將它們全部存儲在單個字段中,可以消除數據庫執行其設計目的的能力:關聯數據。 –

回答

0

使用serialize()unserialize()功能。

參見如何存儲陣列在MySQL這樣一個問題: Save PHP array to MySQL?

但是,不建議您這樣做。我會製作一個單獨的表格來存儲兩個用戶之間的所有'連接'。例如,如果說約翰添加阿里,那麼將會有一個致力於阿里和約翰的紀錄。要查找用戶的朋友,只需查詢其中包含阿里或約翰的記錄即可。但那是我個人的做事方式。

我建議您在需要時使用PHP/MySQL查詢用戶朋友。這可以節省大量的空間,並且不會佔用太多的速度。

1

你應該做的而不是那個在你的聯繫人表和任何相關的表(用戶,朋友,家人,商業)之間有一張地圖表。目的純粹是爲了在你的聯繫人和你的用戶之間創建一個鏈接,而不必做你正在談論的內容,並將數組壓縮到varchar等字段中。

結構化數據方法爲您提供了更靈活的應用程序。

E.g. UserContacts表純粹包含它自己的主鍵(id),用戶的外鍵和聯繫人的外鍵。您可以爲每個類型做到這一點,讓您輕鬆插入,或者只要你喜歡不具有潛在危害的其他數據修改任意數量的用戶和聯繫人之間的映射 - 並沒有複雜的邏輯來打破這樣的:1,2,3,4,51|2|3|4|5

id, user_id, contact_id 

所以後來當你來到用這個結構,你會做這樣的事情:

SELECT 
    Contacts.* 
    -- , Users.* -- if you want the user information 
FROM UserContacts 
LEFT JOIN Contacts ON (UserContacts.contact_id = Contacts.id) 
LEFT JOIN Users ON (Users.id = UserContacts.user_id) 
0

在檢索之前存儲和反序列化之前序列化數組。

$friends_for_db = serialize($friends_array); 
// store $friends_for_db into db 

而且檢索:

// read $friends_for_db from db 
$friends_array = unserialize($friends_for_db); 

但是,應該是明智的遵循有關設置適當多到很多設計其他的答案。不過,我需要這種設計來處理一個小問題,因爲這種設計不需要完整的解決方案(例如,容易存儲/檢索某些多選列表值,我永遠不會查詢也不會使用,除了向用戶顯示外)