Название не имеет особого смысла, но я не мог придумать лучшего названия для этой проблемы.
У меня есть следующие таблицы
проектов
- мне бы
- название
Клиенты
- мне бы
- id_project
- название
платежи
- мне бы
- id_customer
- свидание
- сумма
Когда пользователь входит в систему, он получает доступ к определенному проекту. Теперь я хочу перечислить все платежи за этот проект, и это должно быть довольно просто:
SELECT FROM payments where id_customer in (SELECT id from customers where id_project = 5)
Мой вопрос: если не лучше добавить столбец id_project в таблицу платежей, то запросы будут проще и быстрее.
database-design
normalization
Габриэль Соломон
источник
источник
Ответы:
Кажется, вы спрашиваете, имеет ли смысл денормализация .
Ответ всегда "это зависит", поэтому вот мое эмпирическое правило:
Если ...
тогда оставайся нормализованным . Да, денормализация происходит быстрее, но это также означает, что у вас есть избыточные данные в системе - данные, которые необходимо поддерживать и синхронизировать. Больше нет «одного источника» для этих данных, но есть несколько источников, которые могут отклоняться. Это рискованно с течением времени, поэтому вы не должны делать это, если у вас нет веских причин для этого, подкрепленных некоторыми тестами.
Я бы только денормализовал, когда ...
Операции на современном оборудовании выполняются очень быстро, но они никогда не бывают бесплатными.
источник
Вам было бы лучше переписать запрос как:
Хотя это кажется менее лаконичным, и хороший планировщик запросов увидит, что вы пытаетесь сделать, и вместо этого выполнит коррелированный подзапрос в качестве вышеуказанного соединения, плохой планировщик запросов может в конечном итоге выполнить сканирование индекса
payments.id_customer
(при условии, что у вас есть соответствующий индекс ) (или, что еще хуже, сканирование таблицы) вместо того, чтобы делать вещи более эффективным способом. Даже хороший планировщик запросов может не увидеть оптимизацию, если расположение этого запроса заключено в нечто более сложное. Выражение отношений в виде объединения, а не подзапроса может иметь большее значение, чем изменение структуры данных.Как говорит Джефф, любая денормализация должна рассматриваться с осторожностью - она может легко повысить производительность, особенно для некоторых целей отчетности, но может привести к несогласованности из-за ошибок в поддерживающей бизнес-логике.
В качестве примечания: Очевидно, я не знаю вашего бизнеса, поэтому я мог что-то упустить, но ваши отношения за столом кажутся мне странными. Они подразумевают, что у вас никогда не может быть более одного проекта с одним и тем же клиентом, что обычно не соответствует моему опыту, по крайней мере, в течение длительного периода.
или если быть менее нормализованным (хотя я сомневаюсь, что это будет необходимо):
Конечно, это все еще исключает возможность совместного проекта с двумя клиентами ...
источник
DROP VIEW
+CREATE VIEW
вместоALTER VIEW
.В некоторых базах данных у вас есть возможность создавать «материализованные представления» вместо сложных VIEWS с большим объемом данных на основе сложного запроса. Это можно использовать, чтобы избежать денормализации в исторически сложившейся системе приложений. Если вы решите использовать » Материализованные представления "у вас должно быть четкое представление о методах обновления и объеме хранилища, которое будет использоваться материализованным представлением ...
источник