Структура таблицы базы данных для профиля пользователя с 20 атрибутами
Давайте возьмем, к примеру, сайт знакомств с 100.000 пользователей. Каждый пользователь имеет около 30 атрибутов, таких как цвет волос, курение, возраст, город, пол,... Некоторые атрибуты: bool, некоторые int и некоторые var или text.
Около 20 из этих атрибутов доступны для поиска, и половина пользователей не заполняет данные. Все значения отображаются на странице профиля пользователя.
Я думал о следующих вариантах:
- Разделите данные на 4 таблицы. Таблица 1 используется для данных, которые в основном ищутся, таблица 2 для атрибутов, которые в основном не заполнены, таблица 3 для больших данных, таких как обо мне, и для остальной части таблицы 4.
- Отдельная таблица для большинства атрибутов, поэтому каждый атрибут имеет собственную таблицу.
- Использование модели EAV.
Я думаю, что первый вариант будет лучшим. Или есть другой способ получше?
1 ответ
Предполагая, что вам не нужно будет добавлять новые атрибуты, лучше всего просто поместить все в одну большую таблицу. СУБД обычно достаточно эффективны для хранения NULL. Индексирование NULL также должно быть разумным, некоторые СУБД даже не включают NULL в индексы (Oracle).
Также не бойтесь BLOB - они будут стремиться "растянуть" строки (если часть BLOB размещена в строке в строке, что обычно может управляться специфическими для СУБД способами), снижая вашу "кластеризацию данных", но это не должно быть слишком важным для ваших целей.
В любом случае, измерьте репрезентативные объемы данных, прежде чем решить, что наиболее естественное решение недостаточно эффективно.