繁体   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