[英]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.