[英]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_id
, phone_number
和type
。 user_id
允許您將此表中的行鏈接到相應的User
表行, phone_number
是自解釋的, type
可以是'home','cell','office'等。這使您仍然可以執行任務I如上所述,它還具有不浪費空列空間的額外好處,因為您只需要在此表中添加行。
我不知道你對MySQL有多熟悉,但如果你還沒有聽說過數據庫規范化和查詢JOIN,現在是開始閱讀它們的好時機:)
希望這可以幫助。
我不確定這種方法的優點是什么。 你說“所以,我永遠不會有一個可能永遠不會被使用的專欄...”我認為你的意思是(在你的系統中)有時用戶可能沒有可用的每種電話號碼的價值,以及既然如此,為什么要用空列存儲記錄?
使用一些空列存儲記錄不一定是壞事。 但是,如果要對數據庫進行規范化,則可以為user_phonenumber
創建單獨的表,並在user
和user_phonenumber
記錄之間創建1:many關系。 user_phonenumber
表基本上有四列:
約束是id是主鍵,userid是user.id的外鍵,type是enum(所有可能的電話號碼類型)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.