因此,我使该系统能够为我正在开发的应用存储带有自定义字段的自定义对象。首先,我有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和数据库,非常感谢您的帮助。谢谢!
答案 0 :(得分:0)
我在设计中遇到的问题:
不正确的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 NULL
或UNIQUE
?
如果您不想使用SQL,请不要。还有其他选择,例如文档数据库或键/值数据库。但是不要通过使用它来实现Inner-Platform来折磨可怜的SQL。