Недавно мы с коллегой по профессии обсуждали в Интернете (точнее в ЛС на Хабре) архитектуру некоторой системы, и у нас возник спор по одному вопросу.
Имеется склад, где хранятся разные материалы, имеются документы прихода и расхода материалов, в документах есть записи с информацией "материал, количество", связь один-ко-многим. В базе данных есть таблица с информацией о текущем наличии материалов на складе, есть таблица для документов и таблица для их позиций. Назовем их "current_stocks", "documents", "document_positions".
Считать ли таблицу "current_stocks" денормализацией данных?
Аргумент коллеги заключается в том, что данные в "current_stocks" можно рассчитать по документам за все время существования системы, поэтому это денормализация.
Мой аргумент в том, что любое текущее состояние можно рассчитать по истории изменений, поэтому это не денормализация. Иначе в термине "нормализация" не было бы смысла. Он относится именно к моделированию текущего состояния. Это разные модели, "current_stocks" моделирует состояние склада, "document_positions" строки текста в документах.
akryukov
Есть же
ТостерQ&A. Почему бы не опубликовать этот вопрос на нем?michael_v89 Автор
Там народу мало, тут важна статистика. Это же не вопрос, а опрос, ответ на вопрос я и сам знаю.
michael_v89 Автор
Слушайте, ребята, я серьезно не понимаю, почему надо постить опрос на Тостере, на котором нет функционала опросов, и на котором основной формат вопросов это "Как сделать X в Y?". Функционал опросов есть на Хабре, поэтому я сделал его на Хабре, написал в заголовке первым словом, что это опрос, и написал вопрос опроса до ката, то есть сделал все, чтобы те, кому это не интересно, не тратили время.
akryukov
Опрос не поможет дать ответ на неправильный вопрос.
michael_v89 Автор
А опрос и не для получения ответа делается, а чтобы узнать мнение.
Если вам кажется, что вопрос неправильный, и поэтому вы не можете сказать свое мнение по этому вопросу, тогда опишите в чем неправильность и как должно быть правильно.
akryukov
Я не считаю правильным отвечать вам по теме вопроса, так как вы опубликовали его как статью, не имеющую самостоятельной ценности.
На мой взгляд вы с кем-то поспорили, но у вас не хватило знаний, чтобы обосновать свою позицию (и даже на сам вопрос тоже не очень хватило). Поэтому вы потом будете использовать это как аргумент в споре то, что будет более удобным: самый аргументированный комментарий, либо самый массовый ответ в опросе. Мотивация "опросить мнение остальных" выглядит как отмазка за эту манипуляцию.
К тому же непонятно зачем вообще задавать такой вопрос. Ну допустим там денормализация. Что это изменило?
michael_v89 Автор
С каких пор у опроса должна быть самостоятельная ценность? Ценность опроса в результатах опроса. А на Хабре еще и в комментариях. Правилами вроде не запрещено публиковать опросы на технические темы.
Обоснование моей позиции находится в статье, если вы не заметили. Как и обоснование противоположной стороны.
Ага, например свой, которых я уже тут много написал.
С учетом вышесказанного, вы видите то, что хотите видеть, игнорируя все, что этому не соответствует. Ок, дело ваше.
Так можно сказать про любые вопросы.
Узнать аргументы каждой из сторон. Узнать соотношение мнений. Текущие результаты показывают, что это не такой однозначный вопрос. Да, при случае можно давать ссылку "вот тут люди это обсуждали".
akryukov
Вы со всеми подряд спорите?
michael_v89 Автор
Нет, в основном с теми, кто меня в чем-то некорректно обвиняет. Если не считать аргументированные дискуссии по общим вопросам, которые эту дискуссию предполагают.
sshikov
>Обоснование моей позиции находится в статье, если вы не заметили.
Ну, на самом деле не совсем. Мне вот в итоге нравится то, что получилось, потому что комментарии интереснее поста. Но сам пост изначально предполагает, что мы можем и должны додумывать за вас многие вещи, типа зависимостей атрибутов друг от друга, которые нужны для правильного ответа на опрос. Т.е. оформлен не очень хорошо, и вопрос предварительно не был достаточно проработан.
michael_v89 Автор
Я намеренно написал общими словами, поэтому и сделал один из ответов в опросе "зависит от ситуации". Никто же нам не подсказывает при проектировании системы по бизнес-требованиям. Мне не кажется, что это зависит от ситуации, моделируемая взаимосвязь между сущностями присутствует независимо от модели.
Я на это и рассчитывал)
sshikov
>Я на это и рассчитывал)
Ну это получилось, мне кажется. Но проработка с вашей стороны все равно выглядит недостаточной. Ну вот смотрите: 5НФ, цитирую:
Это же практически про ваш случай. Ну как бы ожидается, что перед созданием такого опроса вы прочитаете хотя бы определения нормальных форм, не так ли?
Да, есть риск возникновения расхождений между агрегатами, рассчитаными по документам, и агрегатами, хрянащимися в отдельной таблице. В этом смысла таблице для аргегатов не нормализована, так как она создает такой риск. Но риск этот потенциальный! Во-первых, можно сделать эту таблицу скажем материализованным view, там где это позволяет СУБД, и тогда расхождений не будет (это гипотеза, и будет ли это хорошо со всех других точек зрения — вопрос отдельный). Ну и есть другие варианты, которые тут уже рассматривали, например такой, что расхождения допускаются вашей бизнес моделью.
Ну т.е. я согласен с мнением выше, что попытка заменить самостоятельную проработку вот этой всей теории опросом — она получилась не очень. Отсюда вероятно и минусы. Большую часть выводов вы могли бы сами сделать, просто перечитав определения.
michael_v89 Автор
Но дело в том, что даже без приложения, без компьютерного учета, у нас все равно должна обеспечиваться логическая целостность между цифрами на бумаге и количеством реальных товаров на складе. У нас даже может быть специальная бумажка "текущие остатки", где они подсчитываются вручную. В этом случае она тоже моделирует сущность реального мира. То, что она должна совпадать с другой сущностью, это особенность предметной области, а не особенность модели. Завтра это требование может поменяться, поменяется и модель. А в случае столбца "comments_cnt" в таблице "articles" в предметной области не может поменяться требование, что оно может не соответствовать количеству комментов в таблице "comments", потому что там эти понятия не разделяются, там есть просто "количество комментариев к статье". В этом я вижу отличие этих ситуаций.
Я читал определение нормальных форм и определение денормализации. Дело как раз в том, что я не согласен, что описанная ситуация соответствует критериям, заданным в этих определениях.
ApeCoder
И что? Модель может стать как соответствущей НФ так и не соответсвующей.
michael_v89 Автор
Я дальше написал. Это не про соответствие модели НФ, а про наличие требования в предметной области, с этим утверждением связаны оба примера. То, что во втором случае у нас есть денормализация, но в предметной области нет соответствующего требования. Такие случаи и подразумевают, когда говорят "денормализация".
ApeCoder
Откуда вы это узнали?
michael_v89 Автор
Оттуда, что по моим наблюдениям такое слово говорили при описании таких ситуаций, очевидно же. Вы-то как считаете, столбец "comments_cnt" в примере с "articles" это денормализация или нет? Если да, то это как раз такой случай.
sshikov
>Дело как раз в том, что я не согласен, что описанная ситуация соответствует критериям, заданным в этих определениях.
Ну, давайте конкретно? Критерии нормальности — это в основном избыточность. Избыточность либо есть, либо нет. В данном случае избыточность — это хранение агрегатов, которые можно вычислить. Бремя обеспечения целостности агрегатов ложится на приложение (если вы считаете что-то руками — никакой разницы не вижу). Одна сущность должна совпадать с другой.
Разве нет? Вполне себе типичный случай для нормализации и денормализации. Но опять же — формы не 3НФ, а более высокие.
Чем это не соответствует?
michael_v89 Автор
Тем, что эта избыточность присутствует в модели. Если мы хотим сделать правильную модель, мы обязаны ее моделировать. И это не денормализация модели. Избыточность в определении нормальных форм это избыточность модели для описания предметной области. То есть некоторые части модели не требуются для описания, но они есть. А в данном примере такой избыточности нет, обе таблицы моделируют разные сущности из предметной области. Правило "А должно равняться сумме Б" это такое же требование бизнес-логики, как и "заказ может редактировать только менеджер заказа".
А в примере с "comments_cnt" и это поле и количество строк в таблице "comments" обозначают одно понятие предметной области "количество комментариев в статье". Тут избыточность описания есть.
sshikov
>Тем, что эта избыточность присутствует в модели.
Тут надо аккуратно :) У слова модель очень много смыслов.
Вы про тут (мета)модель, которая у вас лежит над базой данных?
Если в ней агрегаты это отдельная сущность, и их можно вводить произвольно — то у вас нет такого ограничения, что А должно равняться сумме Б. И тогда, вероятно, нет никакой денормализации.
Мне кажется нужно исходить из того, нормализация это лишь инструмент. Она призвана решать некоторые типы возможных проблем. Если проблем нет — она не нужна. При этом, денормализация — это такой же инструмент, который тоже решает проблемы другого сорта (например, производительности соединений). И ее применяют, если есть эти самые другие проблемы.
Заметьте, что ваша проблема — она лишь потенциальная. Возможно, что ваша архитектура каким-то волшебным образом гарантирует, что таких случаев, когда агрегаты не обновились, их не будет никогда. Это значит, что нормализация не нужна, и ваши таблицы в такой нормальной форме, которая вас устраивает.
По-моему, именно такой подход самый логичный. Нужна ли вам дальнейшая нормализация этих вот таблиц? Если нет — они достаточно нормализованы, и их можно оставить в покое, пусть они хоть в 1НФ при этом. Нужна ли вам денормализация? Если проблем производительности нет — то видимо тоже не нужна. Может ли быть так, что у вас проблемы обоих видов? На мой взгляд — да, можно себе и такое представить.
ApeCoder
А то, что "A" это поле в отношении а не вычислимый атрибут или поле View это требование бизнес логики?
Вы решите, должна база допускать хранение ситауции, когда сумма документов не равна складским остаткам или не должна и тогда у вас это будет одно и то же или не будет. Вот и все. Это и называется ограничение.
justhabrauser
>> Есть же ТостерQ&A. Почему бы не опубликовать этот вопрос на нем?
> Там народу мало
Заблудился охотник в лесу, патроны закончились, еда тоже:
— Лю-у-уди-и-и! Ау-у-у! Есть кто-нибудь?!
Медведь выходит на поляну:
— Ну я есть. Легче стало?