我甚至不知道是否将其称为序列化列是正确的,但我会解释自己,例如,我有一个用户表,我想存储用户手机数字(手机,家庭,办公室等),所以,我想为每个数字类型制作一个列,但同时我想到了一个想法,如果我保存一个json
字符串怎么办?一个列,所以,我永远不会有一个可能永远不会被使用的列,我可以在从数据库中读取数据时将该字符串转换为php数组,但我想听听这种做法的商品和坏处,也许这只是一个坏主意,但首先我想知道其他人对此有什么看法
感谢
答案 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_id
,phone_number
和type
。 user_id
允许您将此表中的行链接到相应的User
表格行,phone_number
是自解释的,type
可以是'home','cell ','office'等。这使你仍然可以执行我上面提到的任务,并且它还有一个额外的好处,就是不会在空列上浪费空间,因为你只需要在这个表中添加行。
我不知道你对MySQL有多熟悉,但如果你还没有听说过数据库规范化和查询JOIN,那么现在是开始阅读它们的好时机:)
希望这有帮助。
答案 3 :(得分:0)
我不确定这种方法的优点是什么。你说“所以,我永远不会有一个可能永远不会被使用的专栏...”我认为你的意思是(在你的系统中)有时用户可能没有可用的每种电话号码的价值,以及既然如此,为什么要用空列存储记录?
使用一些空列存储记录不一定是坏事。但是,如果要标准化数据库,可以为user_phonenumber
创建单独的表,并在user
和user_phonenumber
记录之间创建1:多关系。 user_phonenumber
表基本上有四列:
约束是id是主键,userid是user.id的外键,type是enum(所有可能的电话号码类型)。