【问题标题】:Using MySQL JSON field to join on a table with custom fields使用 MySQL JSON 字段加入具有自定义字段的表
【发布时间】:2019-02-06 13:10:44
【问题描述】:

所以我制作了这个系统来存储自定义对象以及我正在开发的应用程序的自定义字段。首先我有 object_def 我保存对象定义:

id   | name     | fields       
------------------------------------------------------------
101  | Group 1  | [{"name": "Title", "id": "AbCdE123"}, ...]
102  | Group 2  | [{"name": "Name", "id": "FgHiJ456"},  ...]   

所以我们有 ID (INT)、名称 (VARCHAR) 和字段 (LONGTEXT)。在字段中是这样的对象字段:{id: string, type: string, name: string}[]

现在在对象表中,我有这个:

id      | object_def_id | object_values       
------------------------------------------------------------
235     | 101           | {"AbCdE123": "The Object", ... }
236     | 102           | {"FgHiJ456": "John Perez", ... }  

其中 object_values 也是一个 LONGTEXT。使用该系统,我可以使用 JSON.parse() 在我的应用程序中的表格上显示对象。

现在我了解到 MySQL 中有一个 JSON 类型,我希望它可以使用它来执行查询和其他操作(我对此真的很陌生)。

我已将 LONGTEXT 更改为 JSON,现在我想做一个 SELECT 来显示如下结果:

#Select objects in group 1:

id   | group    | Title      | ... | other_custom_field
-------------------------------------------------------
235  | Group 1  | The Object | ... | other_custom_value

#Select objects in group 2:

id   | group    | Name       | ... | other_custom_field
-------------------------------------------------------
236  | Group 2  | John Perez | ... | other_custom_value

Id,然后是组名(我可以使用 INNER JOIN 完成此操作),然后是具有相应值的所有自定义字段。

这可能吗?我怎样才能做到这一点(希望不改变我的数据库结构)?我正在学习 MySQL、SQL 和数据库,所以我非常感谢你的帮助。谢谢!

【问题讨论】:

  • 请问你用的是什么版本的MySQL
  • 我使用的是 5.7.25

标签: mysql json database


【解决方案1】:

我在您的设计中看到的问题:

  • JSON 格式不正确。

    [{name: 'Title', id: 'AbCdE123'}, ...]
    

    应该是:

    [{"name": "Title", "id": "AbCdE123"}, ...]
    

    您应该使用 JSON 数据类型而不是 LONGTEXT,因为 JSON 至少会拒绝无效的 JSON 语法。

  • 根据数据设置列标题。您不能在 SQL 中执行此操作。在准备查询时,必须固定列和标题。您不能执行更改其自己的列标题的 SQL 查询。

  • 你的对象 def 有一个属性数组,但是在 MySQL 5.7 中没有办法遍历 JSON 数组的“行”。您需要在 MySQL 8.0 中使用 JSON_TABLE()

  • 这将使您更接近能够查找对象值,但您仍然必须将数据转入您描述的结果集中,每列中有一个属性,就好像数据有以传统方式存储。但是 SQL 不允许您在单个查询中进行动态透视。您不能创建一个 SQL 查询,它会根据它找到的数据动态增长自己的选择列表。

这一切都让我想知道......

为什么不用传统方式存储数据?

为每个对象类型创建一个表。每个属性向该表添加一列。这样你就可以得到列名。你得到列类型。你会得到列约束——例如,你将如何在当前系统中模拟NOT NULLUNIQUE

如果您不想使用 SQL,请不要使用。还有其他选择,例如文档数据库或键/值数据库。但是不要用糟糕的 SQL 来实现 Inner-Platform 来折磨它。

【讨论】:

  • 关于“不正确的 JSON 格式”,我只是快速输入并使用' 而不是"。实际上在数据库中格式正确,因为它使用JSON.stringify() 通过应用程序发送。而且,如果您阅读了我的问题,我确实将数据类型从 LONGTEXT 更改为 JSON。除此之外,感谢您的解释!
猜你喜欢
  • 2017-02-10
  • 2017-01-28
  • 1970-01-01
  • 2013-11-25
  • 1970-01-01
  • 2013-05-15
  • 1970-01-01
  • 2013-06-15
相关资源
最近更新 更多