@vanin_rus

Как строить архитектуру БД, где у юзеров много полей?

Здравствуйте,

Специфика проекта такова, что у каждого юзера есть достаточно обширный профиль из 50-100 вопросов, при этом некоторые вопросы поддерживают один ответ, а некоторые несколько. Мне не составило больших проблем привести все варианты ответов к уникальным integer в рамках вопросов, обладающих между собой так же уникальными числовыми идентификаторами. То есть мы имеем дело с целыми числами.

По ряду причин мне очень импонирует такая структура данных (здесь и ниже вариант "А"):

user_id (clustered index, primary) | question_1 | question_2 | ... | question_n |

При такой модели на одного юзера всегда приходится одна строка. Эта модель очень удобна для поиска строк по user_id, при том что id добавляются последовательно, и не будут расщеплять индексы, при обновлении я так же контролирую логику, чтобы такого не могло происходить. Это понятно.

Но, как я отметил, некоторые вопросы профиля поддерживают несколько ответов, то есть простые массивы из нескольких integer значений. Можно использовать тип данных столбца json или blob для столбцов, отвечающих за такие вопросы.

Если делать архитектуру "по книжке" (здесь и ниже вариант "Б"):
user_id | answer_variable ,
где для одного user_id будет очень много строк, я не вижу, где бы это вообще выигрывало, кроме ухода от массивов.

Вот и думаю, что теоретически быстрее, скажем, при 100 000 юзеров:
А. Очень быстро найти строку юзера, но затем есть необходимость провести с ней некоторые дополнительные манипуляции, или
Б. В таблице-куче искать все строки для user_id, но по завершению поиска получим очень приятный аккуратный список значений.

Тогда в таблице "А" будет 100 000 строк и 50 столбцов, в то время как в таблице "Б" будет 5 000 000 строк и 2 столбца. Но в первом варианте я всегда сначала выбираю одну строку и быстро получаю выборку в 50 полей.

Можете ли вы что-то посоветовать, как оптимизировать работу с таблицей типа "А", чтобы сгладить/минимизировать издержки работы со строкой, имеющей помимо integer ещё json (serialized)? Или вообще второй / свой вариант?
  • Вопрос задан
  • 153 просмотра
Пригласить эксперта
Ответы на вопрос 3
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
Все по чему нет поиска, то выносится в json.
Если же нужно искать по json например поле парни из 7 бара, для этого создается новая таблица.
И уже оттуда берется список для поиска по Id из основной таблицы
Ответ написан
2ord
@2ord
В Mysql версий 5.6+ есть функция JSON_TABLE, при помощи которой можно получить "аккуратный список" из поля JSON.
Ответ написан
AndyKorg
@AndyKorg
Кнопконажиматель и припоерасплавлятель
Раз используется реляционная СУБД, то наверно имеет смысл использовать классические реляционные модели:
5ee72eb3ca221582982278.jpeg
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы