2012-02-01 59 views
-1

我可以将数组(如[1,2,3,4])或一些JSON(如{"name":"John Johnson","street":"Oslo, "phone":"5551234567"})存储为mysql中的一个记录吗?如果是的话,这是一个好方法还是为了更好的结果,分开这些并存储在单个专栏并定义关系更好吗?什么是在PHP中处理这个好方法?在mysql中将数组存储为单个记录

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

+0

不知道为什么我得到了我的问题! – 2012-02-01 15:35:27

回答

2

你可以;这是一个坏主意。这违反了所谓的标准化。你应该把事情分解成单独的列和表(根据需要)。这需要很多工作来维护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中完成。

+0

我真的不认为,在我的情况下,为此目的,我将有任何理由更新字段中的数据。我只是想将它们存储起来并将它们取回。根据你的想法,如果我不想在数据领域内进行任何操作的情况下,我认为它不会那么糟糕。 – 2012-02-01 14:19:35

1

如果你知道如何编码和解码JSON,你可以将其存储在MySQL数据库TEXT ...

它违背了规范作为平时你有正常化然后进入不同的表....但如果这是那么你唯一的办法用文字

+0

你是什么意思关系...你有任何其他表?如果你需要一个关系,你必须在不同的列上有他们...... – WilfredMifsud 2012-02-01 13:53:25

1

这真的取决于你打算用数据做什么...

您可以序列化(),您的数据并将其存储在一个数据库字段,或可以分开吗并通过MySQL连接访问make(使用它执行搜索等)。如果它始终是标准的(即总是具有相同的字段)将其保存在自己的领域,如果它只是一个随机排列第一种方法是精细

1

你的想法没有错。有时,您可能必须以这种格式保存数据。我在很多应用程序中看到了这一点。例如:保持这样的正则表达式或模式。但考虑到数据库设计准则,这是一个糟糕的主意。如果你想对这个字段进行更新查询,或者改变字段中的一部分文本等,那么这将是一件困难的任务。如果可能,请将数据保存在具有多行的单独表格中。

由于

1

我使用

serialize($item); 

到数据的数组存储到一个场

然后

unserialize($row['field_name']); 

符检索它

我发现这是一个简单的方法来存储数据集的副本进行修改

我不会使用这个作为存储数据在表中的主要方法,虽然我把它放在那里的列,我不想再次操纵它。我只是用它来存储

1

是的,你可以。请记住,你不应该试图在这些领域内进行搜索。预计可怕的表现。标准化后的设计是否完美?不,但它仍然有效。

Doctrine2有一个字段类型来自动执行此操作,并将您的序列化逻辑抽象化。但是,这意味着要使用整个ORM。

如果你走这条路线,我会建议你使用脚本处理数据库迁移。这样,如果您的需求发生变化,并且您需要搜索其中一个值,则您始终可以编写简单的迁移并更新您的数据。修改架构不应该成为一种负担。

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"}' 
); 
+0

你可以通过添加一个例子来改善你的答案,它是如何实际工作的(而不是仅仅提供一个链接)。 – dakab 2015-11-24 21:19:42