Структура таблицы базы данных для профиля пользователя с 20 атрибутами

Давайте возьмем, к примеру, сайт знакомств с 100.000 пользователей. Каждый пользователь имеет около 30 атрибутов, таких как цвет волос, курение, возраст, город, пол,... Некоторые атрибуты: bool, некоторые int и некоторые var или text.

Около 20 из этих атрибутов доступны для поиска, и половина пользователей не заполняет данные. Все значения отображаются на странице профиля пользователя.

Я думал о следующих вариантах:

  1. Разделите данные на 4 таблицы. Таблица 1 используется для данных, которые в основном ищутся, таблица 2 для атрибутов, которые в основном не заполнены, таблица 3 для больших данных, таких как обо мне, и для остальной части таблицы 4.
  2. Отдельная таблица для большинства атрибутов, поэтому каждый атрибут имеет собственную таблицу.
  3. Использование модели EAV.

Я думаю, что первый вариант будет лучшим. Или есть другой способ получше?

1 ответ

Решение

Предполагая, что вам не нужно будет добавлять новые атрибуты, лучше всего просто поместить все в одну большую таблицу. СУБД обычно достаточно эффективны для хранения NULL. Индексирование NULL также должно быть разумным, некоторые СУБД даже не включают NULL в индексы (Oracle).

Также не бойтесь BLOB - они будут стремиться "растянуть" строки (если часть BLOB размещена в строке в строке, что обычно может управляться специфическими для СУБД способами), снижая вашу "кластеризацию данных", но это не должно быть слишком важным для ваших целей.

В любом случае, измерьте репрезентативные объемы данных, прежде чем решить, что наиболее естественное решение недостаточно эффективно.

Другие вопросы по тегам