2012-02-01 60 views
-1

我可以將數組(如[1,2,3,4])或一些JSON(如{"name":"John Johnson","street":"Oslo, "phone":"5551234567"})存儲爲mysql中的一個記錄嗎?如果是的話,這是一個好方法還是爲了更好的結果,分開這些並存儲在單個專欄並定義關係更好嗎?什麼是在PHP中處理這個好方法?在mysql中將數組存儲爲單個記錄

編輯:我想說清楚我想做什麼。我正在使用jQuery UI,並希望以數組格式存儲可拖動和可放置的位置。可拖放和可拖放的標識將與它們的標識及其位置一起標識,以便在用戶需要時可以查詢它們並在下一個html頁面中創建它們。我不確定是否必須在像FROM_TOP,FROM_LEFT這樣的單獨字段中分解這些數組,或者只需要一個數組存儲就足夠了。我也很少關心效率。

+0

不知道爲什麼我得到了我的問題! – 2012-02-01 15:35:27

回答

2

你可以;這是一個壞主意。這違反了所謂的標準化。你應該把事情分解成單獨的列和表(根據需要)。這需要很多工作來維護JSON中的數據。試想一下,你將不得不更新PHP中的整個記錄​​,然後更新記錄。

說我只是想更新電話號碼...

壞:

UPDATE `table` 
SET `Data` = '{"name":"John Johnson","street":"Oslo, "phone":"5551234567foo"}' 

好:

UPDATE `table` 
SET `Phone` = '5551234567foo' 

另一個原因,這將是壞...查詢會LIKE速度慢,很難確定。假設你有一個傳真號碼字段......這個壞例子會是哪一個?

壞:

SELECT * FROM `table` WHERE `Data` LIKE '%5551234567%' 

好:

SELECT * FROM `table` WHERE `Phone` = '5551234567' 

PHP真的不處理架構或數據處理直接,所以沒有方法直接處理這個問題。這一切都在SQL中完成。

+0

我真的不認爲,在我的情況下,爲此目的,我將有任何理由更新字段中的數據。我只是想將它們存儲起來並將它們取回。根據你的想法,如果我不想在數據領域內進行任何操作的情況下,我認爲它不會那麼糟糕。 – 2012-02-01 14:19:35

1

如果你知道如何編碼和解碼JSON,你可以將其存儲在MySQL數據庫TEXT ...

它違背了規範作爲平時你有正常化然後進入不同的表....但如果這是那麼你唯一的辦法用文字

+0

你是什麼意思關係...你有任何其他表?如果你需要一個關係,你必須在不同的列上有他們...... – WilfredMifsud 2012-02-01 13:53:25

1

這真的取決於你打算用數據做什麼...

您可以序列化(),您的數據並將其存儲在一個數據庫字段,或可以分開嗎並通過MySQL連接訪問make(使用它執行搜索等)。如果它始終是標準的(即總是具有相同的字段)將其保存在自己的領域,如果它只是一個隨機排列第一種方法是精細

1

你的想法沒有錯。有時,您可能必須以這種格式保存數據。我在很多應用程序中看到了這一點。例如:保持這樣的正則表達式或模式。但考慮到數據庫設計準則,這是一個糟糕的主意。如果你想對這個字段進行更新查詢,或者改變字段中的一部分文本等,那麼這將是一件困難的任務。如果可能,請將數據保存在具有多行的單獨表格中。

由於

1

我使用

serialize($item); 

到數據的數組存儲到一個場

然後

unserialize($row['field_name']); 

符檢索它

我發現這是一個簡單的方法來存儲數據集的副本進行修改

我不會使用這個作爲存儲數據在表中的主要方法,雖然我把它放在那裏的列,我不想再次操縱它。我只是用它來存儲

1

是的,你可以。請記住,你不應該試圖在這些領域內進行搜索。預計可怕的表現。標準化後的設計是否完美?不,但它仍然有效。

Doctrine2有一個字段類型來自動執行此操作,並將您的序列化邏輯抽象化。但是,這意味着要使用整個ORM。

如果你走這條路線,我會建議你使用腳本處理數據庫遷移。這樣,如果您的需求發生變化,並且您需要搜索其中一個值,則您始終可以編寫簡單的遷移並更新您的數據。修改架構不應該成爲一種負擔。

0

是的,你可以,MySql本身支持JSON-https://dev.mysql.com/doc/refman/5.7/en/json.html。對於「可怕」的性能,現在它不是一個真正的問題,我們在我們的生產服務器中每小時使用它存儲和查詢數百萬行。 MySql也擴展到NoSql領域,所以標準化總是正確的說法是bs。

INSERT INTO TABLENAME(JSON_COLUMN_NAME) VALUES (
    '{"name":"John Johnson","street":"Oslo, "phone":"5551234567"}' 
); 
+0

你可以通過添加一個例子來改善你的答案,它是如何實際工作的(而不是僅僅提供一個鏈接)。 – dakab 2015-11-24 21:19:42