Что касается баз данных, то «Нормализовать для правильности, денормализовать для выполнения» правильную мантру?

Нормализация приводит ко многим существенным и желательным характеристикам, включая эстетическое удовольствие. Кроме того, это также теоретически «правильно». В этом контексте денормализация применяется как компромисс, а исправление для достижения производительности. Есть ли какая-либо причина, кроме производительности, что firebase database может быть денормализирована?

    Двумя наиболее распространенными причинами денормализации являются:

    1. Представление
    2. Невежество

    Первый должен быть проверен с профилированием, в то время как последний должен быть исправлен с помощью свернутой газеты 😉

    Я бы сказал, что лучшая мантра будет «нормализована для правильности, денормализации для скорости – и только при необходимости»,

    Чтобы полностью понять импорт оригинального вопроса, вам нужно понять что-то о динамике команды в развитии систем, а также о поведении (или неправильном поведении) разных ролей / видов людей. Нормализация важна, потому что это не просто беспристрастная дискуссия о шаблонах проектирования – она ​​также имеет много общего с тем, как системы разрабатываются и управляются с течением времени.

    Люди базы данных обучены тому, что целостность данных является первостепенной проблемой. Нам нравится думать о 100% -ной правильности данных, так что, как только данные будут в БД, вам не нужно думать или иметь дело с тем, что это логично неправильно. Эта школа мысли придает большое значение нормализации, потому что она заставляет (сил) команду подходить к основополагающей логике данных и системы. Рассмотрим тривиальный пример: есть ли у клиента только одно имя и адрес, или у него может быть несколько? Кто-то должен решить, и система будет зависеть от того, чтобы это правило применялось последовательно. Это звучит как простая проблема, но умножьте эту проблему на 500x, поскольку вы разрабатываете достаточно сложную систему, и вы увидите проблему – правила не могут существовать только на бумаге, они должны быть соблюдены. Хорошо нормализованный дизайн базы данных (с дополнительной помощью ограничений уникальности, внешних ключей, проверочных значений, триггеров логики и т. Д.) Может помочь вам иметь четко определенную модель данных ядра и правила правильности данных, что действительно важно, если вы хотите, чтобы система работала так, как ожидалось, когда многие люди работают в разных частях системы (разные приложения, отчеты, что угодно) и разные люди работают в системе с течением времени. Или, говоря иначе, если у вас нет способа определить и оперативно применять надежную базовую модель данных, ваша система будет сосать.

    Другие люди (часто, менее опытные разработчики) этого не видят. Они видят в базе данных, как в лучшем случае инструмент, порабощенный приложением, которое они разрабатывают, или, в худшем случае, бюрократию, которой следует избегать. (Обратите внимание, что я говорю «менее опытные» разработчики. Хороший разработчик будет иметь такое же понимание необходимости в твердой модели данных и правильности данных, как человек базы данных. Они могут отличаться тем, что является наилучшим способом достижения этого, но по моему опыту разумно открыты для выполнения этих вещей в уровне БД, если команда БД знает, что они делают, и может реагировать на разработчиков). Эти менее опытные люди часто являются теми, кто настаивает на денормализации, как более или менее оправдание для быстрой и грязной работы по проектированию и управлению моделью данных. Таким образом, вы получаете таблицы базы данных, которые составляют 1: 1, с экранами приложений и отчетами, каждый из которых отражает предположения дизайна другого разработчика и полное отсутствие разумности / согласованности между таблицами. Я пережил это несколько раз в своей карьере. Это неутешительный и глубоко непроизводительный способ развития системы.

    Поэтому одна из причин, по которой люди испытывают сильное чувство нормализации, заключается в том, что проблема является вопросом для других проблем, которые они испытывают. Если вы втянуты в дискуссию о нормализации, подумайте о основополагающей (нетехнической) мотивации, которую стороны могут внести в дискуссию.

    Сказав это, вот более прямой ответ на исходный вопрос 🙂

    Полезно подумать о том, что ваша firebase database состоит из основного дизайна, который максимально приближен к логическому дизайну – высоко нормированному и ограниченному – и расширенному дизайну, который учитывает другие проблемы, такие как стабильные интерфейсы приложений и производительность.

    Вы должны ограничить и нормализовать свою основную модель данных, потому что не делать этого, компрометирует фундаментальную целостность данных и все правила / предположения, на которых строится ваша система. Если вы позволите этим проблемам уйти от вас, ваша система может быстро стать дерьмовой. Проверяйте свою основную модель данных на соответствие требованиям и реальным данным, и повторяйте ее до безумия до тех пор, пока она не будет работать. Этот шаг будет гораздо более похож на уточнение требований, чем на создание решения, и он должен. Используйте базовую модель данных в качестве форсирующей функции, чтобы получить четкие ответы на эти вопросы проектирования для всех участников.

    Завершите свою базовую модель данных, прежде чем перейти к расширенной модели данных. Используйте его и посмотрите, как далеко вы можете с ним справиться. В зависимости от объема данных, количества пользователей и моделей использования вам может не понадобиться расширенная модель данных. Посмотрите, как далеко вы можете получить индексирование, а также 1,001, связанные с производительностью, которые вы можете включить в свою СУБД.

    Если вы действительно используете возможности управления производительностью своей СУБД, вам необходимо взглянуть на расширение вашей модели данных таким образом, чтобы добавить денормализацию. Обратите внимание, что речь идет не о денормализации основной модели данных, а о добавлении новых ресурсов, которые обрабатывают данные денорма. Например, если есть несколько огромных запросов, которые подавляют вашу производительность, возможно, вам захочется добавить несколько таблиц, которые прекомпилируют данные, которые будут создаваться этими запросами, – по существу, предварительный запрос. Важно сделать это таким образом, чтобы поддерживать согласованность денормализованных данных с основными (нормализованными) данными. Например, в СУБД, которые их поддерживают, вы можете использовать МАТЕРИАЛИЗИРОВАННЫЙ ПРОСМОТР, чтобы автоматизировать сохранение данных денорма. Если ваша СУБД не имеет этой опции, возможно, вы можете сделать это, создав триггеры в таблицах, где существуют базовые данные.

    Существует мир различий между выборочной денормализацией базы данных согласованным образом, чтобы справиться с реалистичной задачей производительности, просто имея слабый дизайн данных и используя производительность в качестве оправдания для него.

    Когда я работаю с людьми с низким и средним опытом работы с базами данных и разработчиками, я настаиваю на том, чтобы они создавали абсолютно нормализованный дизайн … затем позже может участвовать небольшое количество более опытных людей в обсуждении избирательной денормализации. Денормализация более или менее всегда плоха в вашей базовой модели данных. Вне kernel ​​нет ничего плохого в денормализации, если вы сделаете это с учетом и согласованности.

    Другими словами, денормализация от нормальной конструкции до той, которая сохраняет нормальное значение при добавлении некоторого денормала, – который касается физической реальности ваших данных при сохранении ее существенной логики, – это прекрасно. Дизайны, которые не имеют kernel ​​нормального дизайна, которые нельзя даже назвать ненормализованными, потому что они никогда не были нормализованы в первую очередь, потому что они никогда не были сознательно разработаны в дисциплинированном виде – это не нормально.

    Не принимайте терминологию, что слабый, недисциплинированный дизайн является «денормализованным» дизайном. Я считаю, что путаница между намеренно / тщательно денормализованными данными и обычным старым дрянным дизайном базы данных, которая приводит к денормальным данным, потому что дизайнер был неосторожным идиотом, является основной причиной многих дебатов о денормализации.

    Денормализация обычно означает некоторое улучшение эффективности поиска (в противном случае, зачем вообще это делать), но при огромных затратах на сложность проверки данных во время операций модификации (вставки, обновления, иногда даже удаления). Чаще всего лишняя сложность игнорируется (потому что это слишком сложно описать), что приводит к поддельным данным в базе данных, которые часто не обнаруживаются до тех пор, – когда кто-то пытается понять, почему компания обанкротилась и оказывается, что данные были непоследовательными, потому что они были денормализированы.

    Я думаю, что мантра должна «нормализоваться для правильности, денормализовать только тогда, когда высшее руководство предлагает отдать свою работу кому-то еще», и в этот момент вы должны принять возможность перейти на пастбища новые, поскольку текущая работа может не сохраниться до тех пор, пока вы Мне нравится.

    Или «денормализовать только тогда, когда руководство отправляет вам электронное письмо, которое освобождает вас от беспорядка, который будет создан».

    Конечно, это предполагает, что вы уверены в своих способностях и ценности для компании.

    Мантры почти всегда упрощают свой предмет. Это пример.

    Преимущества нормализации – это нечто большее, чем просто теоретическое или эстетическое. Для каждого отклонения от нормальной формы для 2NF и выше есть аномалия обновления, которая возникает, когда вы не следуете нормальной форме и которая исчезает, когда вы следуете нормальной форме. Отъезд из 1NF – это совершенно другая возможность червей, и я не собираюсь заниматься этим здесь.

    Эти аномалии обновления обычно относятся к вставке новых данных, обновлению существующих данных и удалению строк. Обычно вы можете обойти эти аномалии умным, сложным программированием. В то время вопрос заключался в том, чтобы использовать умное, сложное программирование, достойное затрат. Иногда стоимость – это ошибки. Иногда стоимость – это потеря приспособляемости. Иногда стоимость на самом деле, верьте или нет, плохая производительность.

    Если вы изучите различные нормальные формы, вы должны считать свое обучение неполным до тех пор, пока не поймете сопутствующую аномалию обновления.

    Проблема с «денормализацией» в качестве ориентира заключается в том, что он не говорит вам, что делать. Существует множество способов денормализации базы данных. Большинство из них несчастны, и это очень мило. Один из самых глупых способов – просто денормализовать один шаг за раз, каждый раз, когда вы хотите ускорить выполнение определенного запроса. Вы в конечном итоге с сумасшедшим mish mosh, который нельзя понять, не зная истории приложения.

    Многие денормализующие шаги, которые «казались хорошей идеей в то время», впоследствии оказываются очень плохими.

    Вот лучшая альтернатива, когда вы решите не полностью нормализовать: принять какую-то конструкторскую дисциплину, которая дает определенные преимущества, даже когда эта проектная дисциплина отходит от полной нормализации. Например, существует схема звездной схемы, широко используемая в хранилищах данных и витринах данных. Это гораздо более последовательный и дисциплинированный подход, чем просто денормализация по прихоти. Есть конкретные преимущества, которые вы получите от дизайна схемы звезды, и вы можете сравнить их с аномалиями обновления, которые вы будете страдать, поскольку дизайн схемы звезд противоречит нормализованному дизайну.

    В общем, многие люди, проектирующие звездные схемы, строят вторичную базу данных, которая не взаимодействует с прикладными программами OLTP. Одной из труднейших проблем в поддержании такой базы данных является так называемая обработка ETL (Extract, Transform и Load). Хорошей новостью является то, что вся эта обработка может быть собрана в нескольких программах, а программистам приложений, которые работают с нормализованной базой данных OLTP, не нужно изучать этот материал. Есть инструменты для помощи в ETL, и копирование данных из нормализованной базы данных OLTP в карту или хранилище данных схемы звездочек является хорошо понятным случаем.

    После того, как вы построили звездообразную схему, и если вы хорошо определили свои измерения, разумно назвали ваши столбцы и особенно выбрали свою гранулярность, используя эту звездную схему с инструментами OLAP, такими как Cognos или Business Objects, оказалось почти так же легко, как играть видеоигра. Это позволяет аналитикам данных сосредоточиться на анализе данных, а не на том, как работает контейнер данных.

    Существуют и другие проекты, помимо звездной схемы, которые отходят от нормализации, но звездная схема заслуживает особого упоминания.

    Хранилища данных в размерной модели часто моделируются в схеме (денормализованной) звезды. Эти схемы не используются (обычно) для онлайн-производства или транзакционных систем.

    Основная причина – производительность, но модель фактов / размеров также позволяет использовать ряд временных функций, таких как медленно изменяющиеся размеры, которые выполняются в традиционных моделях ER-стиля, но могут быть невероятно сложными и медленными (эффективные даты, архивные таблицы, активные записи , и т.д).

    Не забывайте, что каждый раз, когда вы денормализуете часть своей базы данных, ваша способность к ее дальнейшей адаптации уменьшается, так как риски ошибок в коде возрастают, что делает всю систему менее устойчивой.

    Удачи!

    Нормализация базы данных не только для теоретической корректности, но и для предотвращения повреждения данных. Я, конечно, НЕ денормализовал бы «простоту», как предлагает @aSkywalker. Фиксация и очистка поврежденных данных не является чем-то простым.

    Нормализация не имеет ничего общего с производительностью. Я не могу сказать, что это лучше, чем Erwin Smout в этом streamе: каково влияние ресурсов на нормализацию базы данных?

    Большинство СУБД SQL имеют ограниченную поддержку для изменения физического представления данных без ущерба для логической модели, поэтому, к сожалению, это одна из причин, по которой вам может потребоваться демаркализация. Другим является то, что многие СУБД не имеют хорошей поддержки ограничений целостности нескольких таблиц, поэтому в качестве обходного пути для реализации этих ограничений вы можете заставить посторонние атрибуты вносить в некоторые таблицы.

    Вы не нормализуетесь для «правильности» как таковой. Вот что:

    Денормализованная таблица имеет преимущество увеличения производительности, но требует избыточности и большей мощности мозга разработчиков.

    Нормализованные таблицы имеют преимущество сокращения избыточности и повышения простоты разработки, но требуют производительности.

    Это похоже на classическое сбалансированное уравнение. Поэтому, в зависимости от ваших потребностей (например, от того, сколько вы забиваете сервер базы данных), вы должны придерживаться нормализованных таблиц, если это действительно необходимо. Однако легче и дешевле для развития перейти от нормализованного к денормализованному, чем наоборот.

    Ни за что. Имейте в виду, что то, что вы должны нормализовать, это ваши отношения (логический уровень), а не ваши таблицы (физический уровень).

    Денормализованные данные гораздо чаще встречаются в тех местах, где была выполнена недостаточная нормализация.

    Моя мантра «нормализуется для правильности, исключающая производительность». RDBM – очень гибкие инструменты, но оптимизированы для OLTP-ситуации. Замена RDBMS на что-то более простое (например, объекты в памяти с журналом транзакций) может многое помочь.

    Я понимаю, что нормализованные базы данных всегда связаны с более простым, чистым и более надежным кодом. Разумеется, существует много случаев, когда полностью нормализованные связаны с более простым кодом, чем с частично денормализованным кодом, но в лучшем случае это руководство, а не закон физики.

    Кто-то однажды определил слово как кожу живой идеи. В CS вы можете сказать, что объект или таблица определяется с точки зрения потребностей проблемы и существующей инфраструктуры вместо того, чтобы быть платоническим reflectionм идеального объекта. Теоретически не будет никакой разницы между теорией и практикой, но на практике вы найдете вариации от теории. Это высказывание особенно интересно для CS, потому что одним из направлений этой области является обнаружение этих различий и обращение с ними наилучшим образом.

    Отвлекаясь от стороны БД и рассматривая кодирующую сторону вещей, объектно-ориентированное программирование избавило нас от множества пороков спагетти-кодирования, объединив много тесно связанного кода вместе с именем объекта-classа который имеет английское значение, которое легко запомнить и которое каким-то образом соответствует всему коду, с которым он связан. Если слишком много информации сгруппировано вместе, то в конечном итоге вы получаете большую сложность в каждом объекте, и это напоминает код спагетти. Если вы сделаете кластеры малыми, вы не сможете следить за логическими цепочками, не просматривая большое количество объектов с очень маленькой информацией в каждом объекте, который называется «код макаронов».

    Если вы посмотрите на компромисс между идеальным размером объекта на стороне программирования вещей и размером объекта, который является результатом нормализации вашей базы данных, я дам кивок тем, кто сказал бы, что часто лучше выбирать на основе базы данных а затем обойти этот выбор в коде. Тем более, что у вас есть возможность в некоторых случаях создавать объекты из объединений с спящим режимом и подобные технологии. Однако я бы не стал говорить, что это абсолютное правило. Любой слой OR-Mapping написан с идеей сделать самые сложные случаи проще, возможно, за счет добавления сложности к самым простым случаям. И помните, что сложность не измеряется в единицах размера, а скорее в единицах сложности. Там есть всевозможные системы. Ожидается, что некоторые из них вырастут до нескольких тысяч строк кода и останутся там навсегда. Другие предназначены для центрального портала данных компании и могут теоретически расти в любом направлении без ограничений. Некоторые приложения управляют данными, которые читаются миллионы раз для каждого обновления. Другие управляют данными, которые читаются только для аудиторских и специальных целей. В общем правила:

    • Нормализация почти всегда является хорошей идеей в приложениях среднего размера или больше, когда данные по обеим сторонам раскола могут быть изменены и потенциальные изменения не зависят друг от друга.

    • Обновление или выбор из одной таблицы обычно проще, чем работа с несколькими таблицами, однако с хорошо написанным OR эта разница может быть сведена к минимуму для большей части пространства модели данных. Работая с прямым SQL, это почти тривиально для работы в отдельном случае использования, хотя и не в объектно-ориентированном виде.

    • Кодекс должен быть относительно небольшим, чтобы быть управляемым, и один эффективный способ сделать это – разделить модель данных и построить сервис-ориентированную архитектуру вокруг различных частей модели данных. objective оптимального состояния нормализации данных (де) следует рассматривать в рамках парадигмы вашей общей страtagsи управления сложностью.

    В сложных иерархиях объектов есть сложности, которые вы не видите на стороне базы данных, например, каскадирование обновлений. Если вы моделируете реляционные foreign keys и перекрестные ссылки с отношением владения объектами, то при обновлении объекта вы должны решить, следует ли каскадировать обновление или нет. Это может быть более сложным, чем в sql из-за различия между выполнением чего-то и выполнением чего-то правильно всегда, как разница между загрузкой файла данных и написанием синтаксического анализатора для этого типа файла. Код, который каскадирует обновление или удаление в C ++, java или что-то еще, должен будет принять решение правильно для разных сценариев, а последствия ошибок в этой логике могут быть довольно серьезными. Остается доказать, что это никогда не может быть упрощено с небольшой гибкостью на стороне SQL, достаточной для того, чтобы сделать любые сложности sql стоящими.

    Существует также точка, заслуживающая разграничения с одной из нормативных предписаний. Центральным аргументом для нормализации в базах данных является идея о том, что дублирование данных всегда плохое. Это часто верно, но не может быть соблюдено рабски, особенно когда есть разные владельцы для разных частей решения. Я видел ситуацию, когда одна группа разработчиков управляла определенным типом транзакций, а другая группа разработчиков поддерживала аудитоспособность этих транзакций, поэтому вторая группа разработчиков написала сервис, который очищал несколько таблиц всякий раз, когда произошла транзакция, и создала денормализованную в действительности, то, что было состоянием системы в момент транзакции. Этот сценарий является интересным прецедентом (для части дублирования данных по крайней мере), но на самом деле это часть более широкой категории проблем. Желания, связанные с постоянством данных, часто создают определенные ограничения на структуру данных в базе данных, которые могут упростить обработку ошибок и устранение неполадок, делая некоторые из неправильных случаев невозможными. Однако это может также повлиять на «замораживание» частей данных, поскольку изменение этого подмножества данных приведет к тому, что прошлые транзакции станут недействительными в соответствии с правилами согласованности. Очевидно, для сортировки требуется какая-то система управления версиями, поэтому очевидный вопрос заключается в том, следует ли использовать нормализованную систему управления версиями (время действия и время истечения) или подход на основе снимка (значение времени транзакции). Для нормализованной версии есть несколько вопросов внутренней структуры, о которых вам не нужно беспокоиться о подходе к снимкам, например:

    • Можно ли эффективно выполнять запросы диапазона дат даже для больших таблиц?
    • Можно ли гарантировать отсутствие перекрытия диапазонов дат?
    • Можно ли отслеживать события состояния с оператором, транзакцией или причиной изменений? (возможно, да, но это дополнительные накладные расходы)
    • Создавая более сложную систему управления версиями, устанавливаете ли вы правильных владельцев ответственность за правильные данные?

    Я считаю, что оптимальной целью здесь является изучение не только того, что правильно в теории, но и почему это правильно, и каковы последствия нарушений, то когда вы находитесь в реальном мире, вы можете решить, какие последствия стоит потратить, чтобы получить которые другие преимущества. Это настоящая проблема дизайна.

    Система отчетности и система транзакций имеют разные требования.

    Я бы рекомендовал для системы транзакций, всегда использую нормализацию для корректности данных.

    Для системы отчетности используйте нормализацию, если по какой-либо причине не требуется денормализация, например, легкость запроса adhoc, производительность и т. Д.

    Простота? Не уверен, что Стивен соберет меня своей газетой, но там, где я повесил, иногда денормализованные таблицы помогают ребятам / читающим парням выполнять свою работу без искажения базы данных / разработчиков все время …

    Interesting Posts

    Как отключить глобальный фильтр в ASP.Net MVC выборочно

    Entity Framework v2 не поддерживает sql 2000?

    Как эффективно строить дерево из плоской структуры?

    В чем разница между ServletContextHandler.setResourceBase и ResourceHandler.setResourceBase при использовании встроенного контейнера Jetty?

    Не удалось выполнить файл во временном каталоге. Ошибка 5. Доступ запрещен

    Как получить мобильный номер текущей сим-карты в реальном устройстве?

    попробуйте, попробуйте! & пытаться? какая разница, и когда использовать их?

    Виртуальная машина и вирус

    Многострочное редактирование в VSCode

    phonegap открыть ссылку в браузере

    Селектор CSS для отмеченной метки переключателя

    import sun.misc.BASE64Encoder приводит к ошибке, скомпилированной в Eclipse

    Где должны быть обработчики сигналов в проекте django?

    Все библиотеки com.android.support должны использовать ту же самую спецификацию версии

    Какой лучший дизайн базы данных: больше таблиц или больше столбцов?

    Давайте будем гением компьютера.