簡體   English   中英

將數組插入MYSQL字段

[英]Insert Array into MYSQL field

對於論壇,我希望使用戶能夠相互發送消息。 為此,我創建了一個名為Contacts的表,該表中有5個列:user_id,一個用於存儲Friends的列,一個用於存儲Family的列,一個用於存儲Business的列和一個用於其他聯系人的列。 最后四個應該包含一個數組,其中包含該聯系人類型的user_id。 我之所以選擇這種設計,是因為我不想輸入太多或限制用戶的朋友數量,例如friend1,friend2等。

我的問題是:這是正確的嗎? 如果沒有,應該改進什么?Friends,Family,Business和Other應該是哪種類型的MYSQL字段?

您應該做的是在Contacts表和任何相關表(User,Friends,Family,Business)之間建立一個map表。 目的純粹是在您的聯系人和用戶等之間創建鏈接,而無需執行您正在談論的事情並使用壓縮為varchar etc字段的數組。

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

例如,UserContacts表僅包含其自己的主鍵(id),Users外鍵和Contacts外鍵。 您可以針對每種類型執行此操作,從而使您可以隨時在任意數量的用戶和聯系人之間輕松插入或修改地圖,而不會破壞其他數據-無需復雜的邏輯即可分解如下內容: 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)

使用serialize()unserialize()函數。

有關如何在MySQL中存儲數組的問題,請參見以下問題: 將PHP數組保存到MySQL?

但是,不建議您這樣做。 我將創建一個單獨的表來存儲兩個用戶之間的所有“連接”。 例如,如果說約翰添加了阿里,那么將有一條專門記錄阿里和約翰的記錄。 要查找用戶的朋友,只需查詢其中包含Ali或John的記錄。 但這是我個人的做事方式。

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

在存儲之前對數組進行序列化,而在檢索后進行反序列化。

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

對於檢索:

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

但是,應該遵循其他有關設置適當的多對多設計的答案。

但是,我需要這種設計用於較小的情況,而這種情況不需要完整的解決方案(例如,容易存儲/檢索一些我不會查詢或使用的多選列表值,除了向用戶顯示之外)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM