Запись многомерного массива в mysql

12
Samail
На сайте с 10.05.2007
Offline
345
1271

Массив такого типа:


{
"1": {
"cat": 2,
"title": "123",
"materials": {
"brick": 11,
"boards": 22,
"glass": 33
},
"2": {
"cat": 5,
"title": "123",
"materials": {
"nails": 11,
"slate": 22,
"veneer": 33
}
}

С title всё понятно, сделал поле с таким-же название и вставил значение.

А как лучше записать materials, учитывая в дальнейшем нужно будет извлекать из БД все записи у которых в materials например присутствует brick.

SocFishing
На сайте с 26.09.2013
Offline
118
#1

сериализация

1. serialize/unserialize

2. JSON

а затем выборка полнотекстовым поиском

http://www.mysql.ru/docs/man/Fulltext_Search.html

https://www.ibm.com/developerworks/ru/library/os-sphinx/

что-то типа "materials":{"brick":"11"}

или если записей мало то на языке программирования вбирать

голый mysql не предназначен для этого. Например в mongodb можно писать массивы огромной вложенности и затем производить выборку по их ключам.

---------- Добавлено 13.02.2017 в 10:48 ----------

обычно эти самые массивы разносят по другим таблицам и в основной ссылаются на записи

★Сервис идентифицирует (https://socfishing.com/?utm_source=searchengines) посетителей вашего сайта и предоставляет их профили ВКонтакте, Телефон, Почта! Цены копеечные, работаем 8 лет.
Samail
На сайте с 10.05.2007
Offline
345
#2
SocFishing:
а затем выборка полнотекстовым поиском

Это будет быстрее чем оставить массив в файле JSON и извлекать из него?

A
На сайте с 19.07.2010
Offline
130
#3
SocFishing:
сериализация

1. serialize/unserialize
2. JSON

а затем выборка полнотекстовым поиском
http://www.mysql.ru/docs/man/Fulltext_Search.html
https://www.ibm.com/developerworks/ru/library/os-sphinx/
что-то типа "materials":{"brick":"11"}

"materials":{"brick":"11"} - не найдет ни недоразвитый полнотекст от mysql ни скорее всего спринкс, да и тяжелый он для такой мелочевки.

а вот обычный LIKE - найдет, но тут тоже возможны варианты.

можно еще извратиться и сделать два поля:

materials_type: ,brick,boards,glass, - первая и последняя запятые нужны для поиска типа: LIKE '%,brick,%'

materials_value: ,11,22,33,

но лучше всего разнести данные по разным таблицам.

.............
TF-Studio
На сайте с 17.08.2010
Offline
334
#4

materials - вынести в отдельную таблицу и искать джойном?

ну или nosql

ну или лайк json/серриализация

Всё ещё лучший способ заработка для белых сайтов: GoGetLinks (https://www.gogetlinks.net/?inv=fahbn8).
S
На сайте с 30.09.2016
Offline
469
#5

Лайкать, причём если массив будет таким простым, то даже сериализовать необязательно. Но всё зависит от конкретики - смотря по тому, что дальше с ним делать.

Отпилю лишнее, прикручу нужное, выправлю кривое. Вытравлю вредителей.
bay_ebook
На сайте с 28.05.2010
Offline
111
#6

Все зависит от полного задания. Записать можно скачем через json/серриализация и даже LIKE подцепить туда. Но если нужен будет не только поиск но и сортировка - будут проблемы. Тогда лучше выносить в разные таблицы и соединять через join

Нужен прогер на php+mysql+понимание чужего кода? (/ru/forum/540660) Вам сюда PHP-шаман (http://php-shaman.pw/)
L
На сайте с 10.02.2015
Offline
171
#7

Mysql c какой-то версии имеет тип поля JSON.

То есть можно фильтровать более менее нативно.

Но вот индексов по нему не построить :)

Может все же JOIN-нить несколько таблиц?

D
На сайте с 31.01.2017
Offline
15
#8

Samail, если вы на этапе проектирования и таких данных много, рассмотрите вариант смены базы на PostgreSQL. Там очень мощные встроенные инструменты для работы с json.

https://www.postgresql.org/docs/9.5/static/functions-json.html

danforth
На сайте с 18.12.2015
Offline
153
#9

https://dev.mysql.com/doc/refman/5.7/en/json-search-functions.html

В версии MySQL 5.7 появился JSON тип, там же есть функции поиска по JSON.

Но вообще, лучше конечно по таблицам и в JOIN, скорее всего будет и быстрее и первая нормальная форма будет соблюдена.

Junior Web Developer
S
На сайте с 30.09.2016
Offline
469
#10

С JOIN как-то не очень прозрачно видится. Всё равно ведь в основной таблице массив/строку придётся хранить.

Или делать запись для каждого применения в таблице с материалами - но не уверен, что это оптимальнее.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий