Задать вопрос

Как лучше хранить данные в БД?

Есть таблица members с множеством полей.
Сегодня решил сделать одну функцию для своего форума — дополнительные поля профиля.
Передо мной встал вопрос: как хранить данные?
Вариант 1:
Создать отдельную таблицу и посредством LEFT JOIN выводить дополнительные данные.
Вариант 2:
Создавать поля в уже существующей таблице members

Что лучше (менее тяжелое для базы)?
  • Вопрос задан
  • 2759 просмотров
Подписаться 5 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 8
EugeneOZ
@EugeneOZ
Удивляют и вопросы и ответы. Особенно про «опросил бы клиентов». Это ж ух!..
ru.wikipedia.org/wiki/%D0%9D%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%84%D0%BE%D1%80%D0%BC%D0%B0 — читайте это.
Ответ написан
@RubtsovAV
В вашем конкретном случае оптимальным вариантом было бы первое решение с джойнами. Об этом способе оптимизации БД уже давно известно, но от себя все же хочу добавить, что не стоит впадать в крайности и плодить кучу джойнов — достаточно будет одного. Т.е. создание отдельной таблицы для каждого поля (как например сделано в друпале) наоборот замедлит работу БД.
ЗЫ. Есть еще вариант сделать один столбец в таблице и хранить в нем дом поля в виде json, но в вашем случае вряд ли такой способ будет оправдан.
Ответ написан
max7
@max7
max7
Я стараюсь при разработке структуры базы придерживаться философского «никаких UPDATE'ов — только INSERT'ы». Это делает базу значительно более гибкой. Но соответственно увеличивается количество и сложность (JOIN'ы) SELECT'ов. Если есть запас по производительности, то конечно «вариант 1».
Ответ написан
@ComodoHacker
Я бы опросил клиентов, какие поля они хотели бы добавить. Самые востребованные добавил бы в основную таблицу, а фичу «произвольные поля» закинул бы в дальний TODO-лист и забыл.
Ответ написан
Комментировать
@egorinsk
Вариант 2 — если вам надо часто добавлять поля, то учтите, что добавление поля — это фактически создание второй копии таблицы (т.е. долго). Также, при большом числе полей растет объем таблицы, ухудшается время доступа.

Что касается вариата 1, рассмотрите также вариант выбирать записи без JOIN, а 2 запросами — MySQL на джойнах может неэффективно работать (к сожалению, точнее сказать не могу, это надо проверять на практике).

Я бы лично сделал вариант 1, но с кешированием в каком нибудь key-value storage.
Ответ написан
4ikist
@4ikist
Вторая таблица содержит:
id | member_id | field_name | value
Ответ написан
@RubtsovAV
shapershifter08 как раз про такой вариант грил
Ответ написан
shapeshifter08
@shapeshifter08 Автор вопроса
Все спасибо за ответы.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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