Дизайн базы данных для пользовательских данных

#database-design #entity-attribute-value

#database-design #сущность-атрибут-значение

Вопрос:

Я нахожусь на ранних стадиях нового проекта. Поскольку мы разрабатываем итеративно и относительно быстро (разрабатываем продукт по ходу работы), иногда бывает немного сложнее выбрать «правильный» дизайн для чего-то заранее. Мы склонны выбирать что-то и пересматривать, когда это необходимо.

Прямо сейчас я работаю над моделью пользовательских данных. Мой подход заключается в том, чтобы иметь по существу 2 таблицы: одну с необходимыми данными типа входа (имя пользователя, дата создания, учетные данные и т. Д.), А Другую таблицу для хранения ключей, данных значений, которые нам нужны, связанных с пользователями.

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

Это также шаблон, который я использовал раньше.

Мой большой вопрос в том, почему это плохой дизайн в долгосрочной перспективе?

Ответ №1:

Вопросы, которые вы должны задать, следующие:

  • Можем ли мы предсказать все ключи при разработке приложения?
  • Обрабатывает ли наше приложение разные ключи по-разному (т. Е. Есть ли у вас эквивалент if (Key=="something") где-либо в вашем коде)?

Если вы можете заранее спроектировать свое приложение для всех возможных ключей, и ваше приложение обрабатывает их все определенным образом, вам следует просто добавить соответствующие столбцы в «основную» таблицу и вообще прекратить использование таблицы «ключ-значение».

Если вы можете предсказать все ключи, но обрабатываете некоторые из них в общем виде, вы можете сохранить свою структуру или, в качестве альтернативы, вы можете переместить те ключи, которые вы обрабатываете специально, в столбцы «основной» таблицы, а остальные оставить в таблице «ключ-значение».

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

Ответ №2:

Как вы сами сказали:

«При условии, что нам не нужны сложные запросы к данным (чего мы пока не делаем), это обеспечивает хорошую масштабируемость».

Поэтому, как только вам понадобятся «сложные» запросы, это станет неэффективным, как с точки зрения затраченного времени, так и времени, необходимого для правильного написания самих запросов.

Может быть, вы можете подойти к этому поэтапно и перенести некоторые пары ключ-значение в фактические поля таблицы, как только данное подмножество будет использовано «в дикой природе» достаточно, чтобы гарантировать его стабильность?

В целом, реляционная модель имеет свои сильные стороны, и управление большими наборами «псевдополей» ключ-значение не является одним из них. Возможно, для этого вы захотите перейти к продуктам NOSQL.