Использование MySQL JSON-поля для объединения таблицы с настраиваемыми полями - PullRequest
0 голосов
/ 06 февраля 2019

Итак, я создал эту систему для хранения пользовательских объектов с пользовательскими полями для приложения, которое я разрабатываю.Сначала у меня есть 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

Идентификатор, затем имя группы (я могу сделать это с INNER JOIN), а затем все настраиваемые поля с соответствующими значениями.

Возможно ли это?Как я могу достичь этого (надеюсь, не меняя структуру базы данных)?Я изучаю MySQL, SQL и базы данных, поэтому я очень ценю вашу помощь.Спасибо!

1 Ответ

0 голосов
/ 06 февраля 2019

Проблемы с вашим дизайном, которые я вижу:

  • Неверный формат JSON.

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

    Должно быть:

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

    Вы должны использовать тип данных JSON вместо LONGTEXT, потому что JSON по крайней мере отклонит недопустимый синтаксис JSON.

  • Настройка заголовков столбцов на основе данных.Вы не можете сделать это в SQL.Столбцы и заголовки должны быть исправлены во время подготовки запроса.Вы не можете выполнить SQL-запрос, который изменяет свои собственные заголовки столбцов.

  • Ваш объект def имеет массив атрибутов, но в MySQL 5.7 нет способа зацикливаться на «строках»массива JSON.Вам нужно будет использовать JSON_TABLE () в MySQL 8.0.

  • , что позволит вам приблизиться к возможности поиска значений объекта, но тогда вы 'Вам все равно придется преобразовать данные в описанный вами набор результатов с одним атрибутом в каждом столбце, как если бы данные были сохранены традиционным способом.Но SQL не позволяет вам выполнять динамическое вращение в одном запросе.Вы не можете сделать SQL-запрос, который динамически увеличивает свой собственный список выбора на основе найденных данных.

Все это заставляет меня задуматься ...

Почему бы вам просто не сохранить данные традиционным способом?

Создать таблицу для каждого типа объекта.Добавьте один столбец к этой таблице для каждого атрибута.Таким образом, вы получите имена столбцов.Вы получаете типы столбцов.Вы получаете ограничения столбцов - например, как бы вы имитировали NOT NULL или UNIQUE в вашей текущей системе?

Если вы не хотите использовать SQL, то не делайте этого.Существуют альтернативы, такие как базы данных документов или базы данных ключ / значение.Но не мучайте плохой SQL, используя его для реализации Inner-Platform .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...