PHP/MySQL - 将数组数据存储为 JSON,不好的做法?

Posted

技术标签:

【中文标题】PHP/MySQL - 将数组数据存储为 JSON,不好的做法?【英文标题】:PHP/MySQL - Storing array data as JSON, bad practice? 【发布时间】:2011-10-22 03:19:09 【问题描述】:

我想知道将数组作为 JSON 字符串存储在 mysql 文本字段中是否是一种好习惯。

我正在创建一张发票,允许用户向发票中添加无限数量的产品。提交表格时,它会删除所有空白项目等,但我通常会留下 2-5 个项目,具体取决于。每件商品都有一个 sku、价格、名称和描述。

我对这种情况的选择是 (1) 创建一个新产品表,将每个项目添加为新行,将其与发票表链接,并在访问数据时调用这两个表。或者 (2) 将所有产品数据作为单个 JSON 文本字段存储在 invoice 表中,然后我不会创建或访问另一个表。

由于我对 MySQL 编程非常严格,所以我觉得在 MySQL 中使用 JSON 会被拒绝。我对吗?有人可以对此有所了解吗?

【问题讨论】:

【参考方案1】:

如果您只需要存储 - 那么这不是一个坏习惯。

但如果您需要执行任何类型的处理、排序或类似操作 - 您需要对其进行规范化。

【讨论】:

太棒了,感谢您的回答。现在这实际上很有意义,直到我需要允许按产品搜索/排序,然后我想我会没事的。 如果你开始实现数据库逻辑,那么你做错了什么。这是我使用 SQL 数据库时的经验法则。 我不知道什么时候可以。你说的基本是对的,但是当你保存这样的产品时,你一定想知道哪些订单有sku xxx。或者尝试轻松地将产品线添加到订单中。或者真的什么都做。添加具有每个订单行的表并不难,该表具有 id、orderid、sku、price、name、descripiton 字段。也许以后会更多。我看不出有任何理由不这样做。它不像加入这个表会导致性能问题。 Occams Razor 说最好的解决方案是具有最少新假设的解决方案。公平地说,如果您开始保存订单,您应该将它们保存为订单。所以一个订单有几行。只有当有理由不按原样保存它们时(例如:你是 facebook,或者你有性能问题),然后你才需要考虑其他的东西,比如 json-in-a-table。但即便如此,您可能还需要另一种解决方案。所以 occams razor 说:只需按“默认”方式(标准化)进行操作,除非您有理由这样做。 @Nanne:默认方式是不会使我们的代码、查询和架构膨胀的方式。在这种情况下,将所有内容存储在 json 中不会违反第三个 NF(因为我们将该字段视为原子属性)。【参考方案2】:

因为其他人已经更直接地回答了您的问题,所以我将采取一种边缘方法并解决未来的可维护性

现在将数量不定的商品存储为 JSON 格式可能很好,但它会导致大量数据重复。

相反,照你说的做,为所有产品创建一个表格。然后为invoices_have_products 创建另一个表。然后,您可以从 invoices_have_products 中提取与发票 ID 匹配的每一行,然后从 products 中提取每一行,其中产品 ID 与您从 invoices_have_products 中提取的行匹配。

现在可能有点乏味,但是当您的所有数据都在整齐的表格中并且易于查询时,您会更开心。想想使用 JSON 在数百万个文本字段上运行报告的噩梦。太可怕了。

回答您的部分问题:不,我认为这不是好的做法,老实说,它看起来有点像不好的做法。

【讨论】:

【参考方案3】:

我不是 MySQL 专家,但我认为这取决于您想要完成什么。您是否希望已保存到发票中的产品可供搜索?如果是这样,您最好使用关系数据库结构。

如果您不需要搜索,您可以将数据存储为 JSON 字符串,或者简单地存储为序列化数组,从而完全避免使用 JSON。

真的取决于你的需要。

【讨论】:

【参考方案4】:

如果您将其存储在 JSON 中,您将无法使用 SQL 对其进行查询。例如,我无法找出购买超过 3 个产品 A 的所有发票。

【讨论】:

以上是关于PHP/MySQL - 将数组数据存储为 JSON,不好的做法?的主要内容,如果未能解决你的问题,请参考以下文章

PHP/MYSQL 数组存储和检索问题

Chart.js 数据数组使用 PHP、MySQL。如何从 JSON 数组定义数据源?

如何使用java和jsp和extjs将java arraylist转换为json数组存储数据

PHP mySql 数据到 JSON 文件

为啥数组响应没有使用 PHP MySQL API 进入 JSON

python如何将 数组文件 存储为json文件以及对于json文件的读取