json列vs多列

时间:2011-05-13 02:46:21

标签: php mysql performance json

我甚至不知道是否将其称为序列化列是正确的,但我会解释自己,例如,我有一个用户表,我想存储用户手机数字(手机,家庭,办公室等),所以,我想为每个数字类型制作一个列,但同时我想到了一个想法,如果我保存一个json字符串怎么办?一个列,所以,我永远不会有一个可能永远不会被使用的列,我可以在从数据库中读取数据时将该字符串转换为php数组,但我想听听这种做法的商品和坏处,也许这只是一个坏主意,但首先我想知道其他人对此有什么看法

感谢

4 个答案:

答案 0 :(得分:9)

简答,多列。

长答案:

为了爱世界上所有圣洁的人,请不要在单个文本栏中存储多个数据集

我假设您将有一张表

+------------------------------+      +----------------------+
| 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个查询以及搜索和替换算法。不好!<​​/ p>

现在想想第一个解决方案。

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 Users。,phone。 FROM Phone,Users WHERE phone.user_name =? AND Users.U_name =?

插入也很简单,类型检查也很容易。

请记住,这是一个简单的示例,但SQL确实为您的数据结构提供了大量的功能,您应该使用它而不是避免使用它

答案 1 :(得分:2)

如果你使用json,那么有比MySQL更优雅的方式。建议使用另一个更好地使用json的数据库,比如mongoDB或像Persevere这样的SQL包装器,http://www.persvr.org/Documentation(参见“Perstore”)

答案 2 :(得分:1)

我只会用非基本数据来做这件事,例如,用户最喜欢的颜色,最喜欢的有袋动物类型(显然“非必要”是供你决定的)。对基本数据(电话号码,用户名,电子邮件,名字,姓氏等)执行此操作的问题在于您将自己限制为可以使用数据库完成的任务。这些包括索引字段,使用ORDER BY子句,甚至搜索特定的数据。如果以后你意识到你需要执行任何这些任务,那将是一个令人头痛的问题。

在这种情况下,您最好的方法是使用1对多对象的关系表 - ex UserPhoneNumbers。它有3列:user_idphone_numbertypeuser_id允许您将此表中的行链接到相应的User表格行,phone_number是自解释的,type可以是'home','cell ','office'等。这使你仍然可以执行我上面提到的任务,并且它还有一个额外的好处,就是不会在空列上浪费空间,因为你只需要在这个表中添加行。

我不知道你对MySQL有多熟悉,但如果你还没有听说过数据库规范化和查询JOIN,那么现在是开始阅读它们的好时机:)

希望这有帮助。

答案 3 :(得分:0)

我不确定这种方法的优点是什么。你说“所以,我永远不会有一个可能永远不会被使用的专栏...”我认为你的意思是(在你的系统中)有时用户可能没有可用的每种电话号码的价值,以及既然如此,为什么要用空列存储记录?

使用一些空列存储记录不一定是坏事。但是,如果要标准化数据库,可以为user_phonenumber创建单独的表,并在useruser_phonenumber记录之间创建1:多关系。 user_phonenumber表基本上有四列:

  • id(主键)
  • userid(用户表的外键)
  • 类型(例如手机,家庭,办公室等)
  • 值(电话号码)

约束是id是主键,userid是user.id的外键,type是enum(所有可能的电话号码类型)。