将数组存储为mysql中的单个记录

时间:2012-02-01 13:49:27

标签: php mysql json

我可以将[1,2,3,4]之类的数组或{"name":"John Johnson","street":"Oslo, "phone":"5551234567"}之类的JSON存储为mysql中的一条记录吗?如果是的话,这真的是一个好的方法还是更好的结果,将它们分开并存储在单个列中并定义关系是否更好? php处理这个问题的好方法是什么?

编辑:我想说明我想做什么。我正在使用jquery UI,并希望以数组格式存储draggable和droppable的位置。可拖动和可放置的标识将与其ID以及它们的位置一起标识,以便可以查询它们并在用户想要的时候在下一个html页面中创建它们。我不确定是否必须在像FROM_TOP,FROM_LEFT这样的单独字段中爆炸这些数组,或者仅仅一个数组存储就足够了。我也很少关注效率。

8 个答案:

答案 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"}'
);