Обычные формы предназначены не только для баз данных

obychnye formy prednaznacheny ne tolko dlya baz dannyh

Также можно применить подобные правила к типам объектов данных.

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

Что такое аномалия данных?

Предположим, у нас была такая ситуация:

Таблица A содержит значения свойств X, Y, Z для строки, определяемой идентификатором x; эти есть утверждение о х. Скажем Y в ряд x утверждается, что это значение 3.

Таблица B также содержит те же утверждения о том, почему Y для x

Позже в таблице А сказано: «Факты поменялись. Y сейчас 4″

Позже спрашивается таблица B, и она говорит, что Y все еще равняется 3.

Теперь A и B утверждают два разных факта об Y, в зависимости от того, какую таблицу вы спрашиваете.

Это аномалия данных: два разных утверждения о факте. А факты имеют значение в компьютерных системах.

Что и почему для нормальных форм

Я буду использовать термин типа для обозначения метаданных объекта Это может быть реализовано посредством определения класса, миксина, признака, штампа или любого другого механизма, поддерживаемого вашими предпочтениями и языком выбора. Я также сосредоточу внимание на объекты данных, такие как POJO, PODO, JSON и подобные простые объекты.

Неформально первые три нормальные формы описываются следующим образом:

Первая нормальная форма (1NF): нет повторяющихся элементов или групп элементов

Вторая нормальная форма (2NF): все неключевые атрибуты зависят от всего ключа

Третья нормальная форма (3NF): нет зависимости от неключевых атрибутов

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

Объекты также являются реляционными

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

В иерархии у вас есть отношения между родителями и детьми. Часто существует иерархия типов данных (класс-подкласс), которая также моделируется. Связи в иерархии содержания объектов более ограничены, как правило, односторонними (родительские и дочерние), но также более легкими для понимания, чем более общие (и гибкие) ассоциации.

1NF: нет повторяющихся элементов или групп элементов

Скажем, у нас есть такая контактная информация:

K6MgfQspOPhM3PLOSTXy5R07r-kZHXmENGgZ

Где повторяющиеся элементы?

  1. Атрибуты имени: это можно считать связью «один ко многим», где количество имен не определено (например, британское королевское лицо). На практике, однако, для большинства доменов приложений достаточно имени, фамилии и, возможно, отчества, поэтому нет реальной необходимости нормализовать эти поля.
  2. телефоны: повторение атрибутов телефона выглядит как потенциальная проблема: достаточно ли двух телефонов? А что, если дополнительная информация будет со временем связана с номером телефона, например доступное время?
  3. адресные строки: опять же двух достаточно? В некоторых странах адреса могут содержать четыре строки, но это предел. Поскольку это простые строки, не будет трагедией, если позже будет добавлена ​​еще одна или две строки адреса.

Вот возможная модель с типами контактов и телефонов:

9U5kybRDlVxzkYsQAakm-4UKr6Ag8jLedftT

2NF: все неключевые атрибуты зависят от всего ключа

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

Давайте еще раз посмотрим на Контакт:

XUzKdMHD4qLCfsrcFuVnAjnbt4jW4P52iNnL

Здесь ключ – это сгенерированное значение идентификатора, которое иногда называют суррогатным ключом. Зависят ли атрибуты адреса от Contact ID? Ну…

Всё зависит от домена.

Шесть свойств адреса, безусловно, не являются атрибутами Контакта, а скорее средствами идентификации физического расположения. Возможно, контакт может иметь много адресов и, возможно, адрес имеет много контактов.

Следует ли моделировать это как отношение многих к некоторым типам объекта ContactAddress, который имеет идентификатор контакта и идентификатор адреса? Это будет зависеть от того, что важно для домена вашего приложения. Некоторые приложения могут рассматривать контакты как сильные объекты, независимые от адреса, но адреса как слабые объекты, зависящие от контакта. В этом случае один контакт может иметь много адресов, и каждый адрес ссылается на контакт, например:

fR5nqYyCmC8BomUNDq8wl514ZiFl41UOWe-K

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

3NF: нет зависимостей от неключевых атрибутов

Снова посмотрев на Address, вы можете заметить два зависимых поля, регион и страна. Страна может иметь регионы, а может и не иметь, но у региона страна: вы не хотите их путать.

Один из способов убедиться, что регион принадлежит правильной стране: создать идентификатор для каждой пары (страна, регион), а затем адрес ссылаться на идентификатор, а не на регион и страну независимо:

iILOA2dV6A3xU--R6yv4Raa80jsHU0KRh55L

Несколько слов о сгенерированных идентификаторов

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

Таблица на тип, таблица на тип иерархии

В нормализованных типах объектов великолепно то, что они просто сопоставляются с таблицами реляционной базы данных. Для реализации реляционной базы данных таблицы отображают типы объектов (Table per Type) или, по крайней мере, содержат информацию для нескольких типов, полученных от базового типа (Table per Type Hierarchy). Это может звучать так, будто я выступаю за объектно-реляционное отражение, но нет… Я просто говорю, что полезно, чтобы ваша логическая модель разделяла те же характеристики физической модели концептуальный уровень. Реализация – это совсем другая тема.

Ссылки

Существует много ресурсов по нормализации схем баз данных отношений:

Нормализация базы данных: первая, вторая и третья нормальные формы – Эндрю Роллинз
Я прочитал отличное объяснение первой, второй и третьей нормальной формы несколько недель назад. Для тех, кто знает, какая база данных…
www.andrewrollins.com

Вторая нормальная форма базы данных объясняется простым английским
Во втором сообщении сосредоточено на первой нормальной форме, ее определении и примерах, которые можно использовать. Теперь пришло время…
www.essentialsql.com

Что такое вторая нормальная форма (2NF)? — определение из Техопедии
Вторая нормальная форма 2NF Определение – Вторая нормальная форма (2NF) является вторым шагом в нормализации базы данных. 2NF строит…
www.techopedia.com

Третья нормальная форма базы данных объясняется простым английским языком
Третий пост сосредотачивался на второй нормальной форме, ее определении и примерах, которые можно понять. Как только стол будет…
www.essentialsql.com

Кроме того, исследуя эту публикацию, я встретил несколько иное отношение к тому, как применять правила нормализации к типам объектов.

Введение в нормализацию классов
www.agiledata.org

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *