@dk-web

Как правильно хранить множественные атрибуты в MySQL и их выводить на сайт?

Очередной головняк себе придумал...
Решил сделать не селект с единственным выбором города, а множественный выбор. То есть один объект, человек, может относиться к нескольким городам.
Чекбоксы, выбор, implode через запятую, запись в БД.
Теперь поле city в БД у меня выглядит так: 2, 3, 26
И теперь не могу сообразить... как искать то теперь по городу? Ну всяко не через like...
Как такие множественные "события" вообще верно хранить? это могут быть интересы человека, да те же теги, пожалуй.
Буду признателен за рекомендации.
  • Вопрос задан
  • 1387 просмотров
Решения вопроса 2
frost18
@frost18
Программист PHP
Не верно. В одной ячейки один id должен храниться. Вам нужно создать еще одну связующую таблицу соотношением один ко многим.
Ответ написан
Комментировать
TheCreator
@TheCreator
Бездельник
Если городов конечное множество и они редко изменяются - вам поможет поле SET.
Если же нет - то можно использовать битовую арифметику (фактически тот же SET, но данные хранятся в другой таблице, а айди нужных городов кодируются в битовое слово), это немножко сложно, но очень эффективно.

Например у вас таблица
1. Москва
2. Петербург
3. Самара.

Человек выбрал самару и петербург.
Самара это 2 ^ 2, Петербург это 2 ^ 1, складываем, получаем число 5, которое в двоичном выражении записывается, как 110, а это значит (читаем его с конца), что первый элемент не задан, второй задан, третий задан, что вам и нужно. Для поиска по битовым маскам тоже есть операторы, XOR и другие.

Почитайте, это интересно, если хотите заморачиваться, но для списка городов, наверное, излишне.

Для них обычно создают таблицу связей, первая колонка - айди человека, вторая - айди города. И добавляете в неё несколько записей, чтобы отметить несколько городов, потом легко искать.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
jumper423
@jumper423
web-developer
Или сделать как сказал Frosty 87 или записать их в виде массива. Не помню как для MySQL, для постгри это тип поля integer[]. Тогда можно будет и искать нормально и всё остальное делать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы