незваный гость писал(а):
Есть БД книг. Запись из двух элементов, название и цвет обложки (RGB, три целых). Ключевое требование — поиск только по названию.
Нормализация требует сделать отдельную таблицу цветов. Реально, при поиске только по названию, это приведет к дополнительным дисковым запросам.
Фома писал(а):
Вот пример из жизни. БД, связанная с учетом (бухгалтерским, складским и т.п.) , теоретически может хранить только проводки движения денег, товаров, ... Но при этом будет очень долго на больших объемах информации отвечать на вопрос: А каковы были остатки на счетах, складах... на 25 июля позапрошлого года? Альтернатива - хранить историю остатков, а это противоречит теории нормализации, но сильно убыстряет процесс!
Мне ожидалось, что пример будет о добавлении данных в базу, а не о извлечении данных...
В тех же умных книжках понаписано, что таблица -- это логическая, а не физическая структура, мол СУБД хранит данные совсем не в виде таблиц, и поэтому быстрота поиска не определяется тем, по скольким таблицам тот идёт, а больше тем, как хороша реализация (кеширование, индексация и т. п.).
Выходит, то проблема СУБД, а не разработчика БД (ессно, тот должен учитывать особенности используемых им СУБД).
На это у меня всегда возникало недоумение: но при добавлении-то данных к базе всяко имеет значение в одну таблицу мы добавляем или в несколько.
Например, ввод данных о новой книге требует обновления двух таблиц -- это всяко медленнее, чем обновление одной; или я как раз и не прав?
Строго говоря, думается, любая структуризация базы (когда используется не одна-единственная таблица) будет снижать производительность как запросов, так и обновлений.
То есть, полюбому речь идёт о том, чтобы найти разумный баланс противоречивых желаний.
Вывод: присоединяюсь к высказанному уже мнению о том, что нормализация не догма, но типа бестпрактис, на который нужно ориентироваться, но не применять механически где не попадя.
Добавлено спустя 11 минут 13 секунд:незваный гость писал(а):
В моей практике наиболее частым случаем было что ненормализованная часть данных имела статус «кэша», работающего только на чтение.
И у меня снова вопросик из любопытсва...
Например, я имею очень большую кучу нормализованных таблиц, которую я в основном читаю в основном даже похожими запросами.
Чтобы не париться, я делаю представление, которое будет, собственно, как раз той ненормализованной таблицей, которую я бы использовал, если бы букварей не читал.
Вопрос: способна ли едрёна СУБД устроить так, чтобы запрос к представлению работал хоть б чуть быстрее, чем аналогичный запрос к туче нормализованных таблиц?