我可以将[1,2,3,4]
之类的数组或{"name":"John Johnson","street":"Oslo, "phone":"5551234567"}
之类的JSON存储为mysql中的一条记录吗?如果是的话,这真的是一个好的方法还是更好的结果,将它们分开并存储在单个列中并定义关系是否更好? php处理这个问题的好方法是什么?
答案 0 :(得分:2)
你可以;这是一个坏主意。这违反了一些名为 normalization 的内容。您应该将事物分成单独的列和表(根据需要)。要在JSON中维护数据需要大量的工作。试想一下,你必须用PHP更新整个记录然后更新记录。
说我只想更新电话号码......
为:
UPDATE `table`
SET `Data` = '{"name":"John Johnson","street":"Oslo, "phone":"5551234567foo"}'
好:
UPDATE `table`
SET `Phone` = '5551234567foo'
这样做的另一个原因是糟糕的......用LIKE查询会很慢,很难确定性。假设你有一个传真号码字段......哪一个是错误的例子?
为:
SELECT * FROM `table` WHERE `Data` LIKE '%5551234567%'
好:
SELECT * FROM `table` WHERE `Phone` = '5551234567'
PHP实际上并不处理架构或直接处理数据,因此没有方法直接处理它。这一切都在SQL中完成。
答案 1 :(得分:1)
如果你知道如何编码和解码json,你可以将它作为TEXT存储在你的Mysql数据库中......
它违反了规范,因为通常你已经规范化然后进入不同的表....但如果这是你唯一的方法,那么使用TEXT
答案 2 :(得分:1)
这实际上取决于你将如何处理数据......
您可以序列化()数据并将其存储在一个数据库字段中,或者您可以将其分开,并且可以从MySQL连接访问(使用它来执行搜索等)。如果它总是标准的(即总是有相同的字段)将它保存在它自己的字段中,如果它只是一个随机数组,那么第一种方法就可以了
答案 3 :(得分:1)
你的想法没有错。有时,您可能必须以这种格式保存数据。我在许多应用程序中看到了这一点。例如:保持这样的正则表达式或模式。但考虑到数据库设计指南,这是一个坏主意。如果您想对此字段执行更新查询,或者更改字段中的部分文本等,那么这将是一项艰巨的任务。如果可能,请将数据保存在具有多行的单独表中。
由于
答案 4 :(得分:1)
我用
serialize($item);
将数据数组存储到一个字段
然后
unserialize($row['field_name']);
检索它
我发现这是一种存储修订数据集副本的简便方法
我不会将此作为在表中存储数据的主要方法,虽然我把它放在那里的列我不会再尝试操纵它。我只是用它来存储
答案 5 :(得分:1)
是的,你可以。请记住,您不应该尝试在这些字段中进行搜索。预计会有糟糕的表现。是否符合标准化的完美设计?不,但它仍然有效。
Doctrine2有一个字段类型可以自动执行此操作并从中抽象出序列化逻辑。但是,这意味着要使用整个ORM。
如果你走这条路,我会建议你使用脚本处理数据库迁移。这样,如果您的需求发生变化并且您需要搜索其中包含的值之一,您始终可以编写简单的迁移并更新数据。修改架构不应该是一种负担。
答案 6 :(得分:0)
在将数组放入数据库时尝试使用json_encode,从数据库中提取时使用json_decode。
答案 7 :(得分:0)
是的,MySql本身支持JSON,请参阅 - https://dev.mysql.com/doc/refman/5.7/en/json.html。
至于“可怕的”性能,它现在不是真正的问题,我们在生产服务器中使用它,每小时存储和查询数百万行。 MySql也扩展到NoSql领域,因此规范化总是正确的主张是bs。
INSERT INTO TABLENAME(JSON_COLUMN_NAME) VALUES (
'{"name":"John Johnson","street":"Oslo, "phone":"5551234567"}'
);