簡體   English   中英

json列vs多列

[英]json column vs multiple columns

我甚至不知道是否將其稱為序列化列是正確的,但我將解釋自己,例如,我有一個用戶表,我想存儲用戶的電話號碼(手機,家庭,辦公室等)所以,我想為每個數字類型創建一個列,但同時我想到了一個想法,如果我在一個列中保存一個json字符串,那么,我將永遠不會有一個列可能將永遠不會被使用,我可以在從數據庫中讀取數據時將該字符串轉換為php數組,但我想聽聽這種做法的商品和壞處,也許這只是一個壞主意,但首先我想知道是什么其他人不得不說

謝謝

簡答,多列。

答案很長:

為了愛世界上所有聖潔的人,請不要在單個文本列中存儲多個數據集

我假設你將有一張桌子

+------------------------------+      +----------------------+
| User |  cell | office | home |  OR  | User | JSON String   |
+------------------------------+      +----------------------+

首先,我會說這兩種解決方案都不是最好的解決方案,但如果你要從兩者中選擇第一種解決方案是最好的。 主要有幾個原因,但具體修改和查詢的能力非常重要。 想想algrothim修改第二個選項。

SELECT `JSON` FROM `table` WHERE `User` = ?

Then you have to do a search and replace in either your server side or client side language

Finally you have to reinsert the JSON string

此解決方案總計2個查詢和搜索和替換算法。 不好!

現在想想第一個解決方案。

SELECT * FROM `table` WHERE `User` = ?

Then you can do a simple JSON encode to send it down

To modify you only need one Query.

UPDATE `table` SET `cell` = ? WHERE `User` = ?

to update more than one its again a simple single query 

UPDATE `table` SET `cell` = ?, `home` = ? WHERE `User` = ?

這顯然更好,但並不是最好的

還有第三種解決方案假設您希望用戶能夠插入無限數量的電話號碼。

讓我們使用關系表,所以現在有兩個表。

              +-------------------------------------+
+---------+   |      Phone                          | 
| Users   |   +-------------------------------------+ 
+---------+   | user_name| phone_number | type      |
| U_name  |   +-------------------------------------+
+---------+

現在,您可以使用類似的內容查詢用戶的所有電話號碼

現在,您可以通過連接查詢表

SELECT用戶。 , 電話。 來自電話,用戶WHERE phone.user_name =? AND Users.U_name =?

插入也很簡單,類型檢查也很容易。

請記住,這是一個簡單的示例,但SQL確實為您的數據結構提供了大量的功能,您應該使用它而不是避免使用它

如果你使用json,那么有比MySQL更優雅的方法。 建議使用另一個與json更好地工作的數據庫,如mongoDB或像Persevere這樣的SQL包裝器, http ://www.persvr.org/Documentation(參見“Perstore”)

我只會用非基本數據來做這件事,例如,用戶最喜歡的顏色,最喜歡的有袋動物類型(顯然“非必要”是供您決定的)。 對基本數據(電話號碼,用戶名,電子郵件,名字,姓氏等)執行此操作的問題在於您將自己限制為可以使用數據庫完成的任務。 這些包括索引字段,使用ORDER BY子句,甚至搜索特定的數據。 如果以后你意識到你需要執行任何這些任務,那將是一個令人頭痛的問題。

在這種情況下,您最好的方法是使用1到多個對象的關系表 - 例如UserPhoneNumbers 它將有3列: user_idphone_numbertype user_id允許您將此表中的行鏈接到相應的User表行, phone_number是自解釋的, type可以是'home','cell','office'等。這使您仍然可以執行任務I如上所述,它還具有不浪費空列空間的額外好處,因為您只需要在此表中添加行。

我不知道你對MySQL有多熟悉,但如果你還沒有聽說過數據庫規范化和查詢JOIN,現在是開始閱讀它們的好時機:)

希望這可以幫助。

我不確定這種方法的優點是什么。 你說“所以,我永遠不會有一個可能永遠不會被使用的專欄...”我認為你的意思是(在你的系統中)有時用戶可能沒有可用的每種電話號碼的價值,以及既然如此,為什么要用空列存儲記錄?

使用一些空列存儲記錄不一定是壞事。 但是,如果要對數據庫進行規范化,則可以為user_phonenumber創建單獨的表,並在useruser_phonenumber記錄之間創建1:many關系。 user_phonenumber表基本上有四列:

  • id(主鍵)
  • userid(用戶表的外鍵)
  • 類型(例如手機,家庭,辦公室等)
  • 價值(電話號碼)

約束是id是主鍵,userid是user.id的外鍵,type是enum(所有可能的電話號碼類型)。

暫無
暫無

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

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