@hsc
full stack python back-end developer

Как сохранять в БД данные о больших объектах (где-то 120-200 полей)?

Приветствую!

На поточном проекте появилась задача сохранять в БД данные о больших объектах (где-то 120-200 полей). Эти данные практически никогда не будут запрашиваться одновременно. Скорее всего они будут запрашиваться порциями по 20-40 полей. Также, известно, что выборки будут редко пересекаться, чаще всего выборки будут идти сегментами, например от 1-го до 20-го поля, от 21-го до 40-го и т.д, но все же могут возникать ситуации когда выборки будут пересекаться.

Вопрос:
Как лучше представить такой объект в схеме БД?

Я не db-архитектор, посему могу ошибаться, но мне видятся 2 возможных варианта:
1. Создать несколько таблиц согласно предполагаемым сегментам. Предположительные плюсы: лучший кэш, возможность легкого шардинга по сравнению с партицированием монолитной таблицы. Минусы: overhead на ключевые поля и join'ы, overhead на разруливание на уровне логики приложения, не очень интуитивная схема и не очень легкий контроль данных.

2. Создать одну большую таблицу. Плюсы: предположительно лучший кеш, отсутствие overhead'а на join'ы и ключеые поля. Минусы — предположительные проблемы при масштабировании.

Ответ вроде бы очевиден, но я хочу просить совета именно с точки зрения производительности и опыта старших) Система большая и сложная, и мы можем позволить себе чуть сложнее написать код, но добиться лучшей производительности. Даже прирост в 5% будет ценным. Тесты пока не делал. Решил сначала спросить.

Благодарю и желаю всем добра!
  • Вопрос задан
  • 2962 просмотра
Решения вопроса 2
kompi
@kompi
nullstack devoops
Посмотрите в сторону materialized views (9.3)
Ответ написан
Комментировать
Kerman
@Kerman
Всё, конечно, зависит от деталей. Тут может быть столько деталей, что даже наводящие вопросы смысла нет задавать. Но.
Лучше делать отдельные таблицы. Это один из принципов управления сложностью. Называется декомпозиция. Если появляются такие страшные цифры в 100-120 полей таблицы, то значит, что с таблицей что-то не так.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@hsc Автор вопроса
full stack python back-end developer
Дополню ответы информацией, которую нашел:
Postgres: many columns or several tables?
Ответ написан
Комментировать
@zen
Поля, по которым нужно что-то интенсивно делать, надо иметь отдельно, а остальные - в hstore. hstore мы придумали как раз для таких задач, когда есть очень много "хлама", который нужен только для показа. Правда, потом, мы добавили индексы и теперь в этом хламе можно еще и искать :)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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