У меня вопрос, связанный с дублированием, которое я время от времени вижу в базах данных. Чтобы задать этот вопрос, мне нужно немного подготовить почву:
Допустим, у меня есть база данных телешоу. Его основная таблица Content
хранит информацию на различных уровнях детализации (Show -> Season -> Episode
), используя родительский столбец для обозначения иерархии:
+----+---------------------------+-------------+----------+
| ID | ContentName | ContentType | ParentId |
+----+---------------------------+-------------+----------+
| 1 | Friends | Show | [null] |
| 2 | Season 1 | Season | 1 |
| 3 | The Pilot | Episode | 2 |
| 4 | The One with the Sonogram | Episode | 2 |
+----+---------------------------+-------------+----------+
Возможно, это не идеально, но допустим, что это достаточно хорошо, чтобы работать, и мы не собираемся его менять.
Теперь предположим, что нам нужно создать таблицу, которая определяет даты выхода в эфир. Мы можем установить их на любом уровне, и они должны применяться вниз по иерархии (например, если они установлены на уровне сезона, они применяются ко всем эпизодам в этом сезоне; если они установлены на уровне шоу, они применяются ко всем сезонам и эпизодам).
Таким образом, исходные даты выхода в эфир могут выглядеть так:
+-------+-----------+------------+
| airId | ContentId | AirDate |
+-------+-----------+------------+
| 71 | 3 | 1994-09-22 |
| 72 | 4 | 1994-09-29 |
+-------+-----------+------------+
В то время как дата выхода в эфир для потокового сервиса может выглядеть так:
+-------+-----------+------------+
| airId | ContentId | AirDate |
+-------+-----------+------------+
| 91 | 1 | 2015-01-01 |
+-------+-----------+------------+
Круто. Пока все хорошо; мы придерживаемся 4NF (я думаю!) и можем перейти к нашему бизнес-логу c.
Теперь мы переходим к моему вопросу. Если мы реализуем нашу бизнес-логику c таким образом, чтобы игнорировать ссылочную иерархию, а вместо этого дублировать эфирные даты вниз по иерархии, как называется этот анти-шаблон? Например, скажем, я установил дату выхода в эфир на уровне Show, как указано выше, но бизнес-лог c находит все дочерние элементы и создает запись для каждого из них, в результате получается:
+-------+-----------+------------+
| airId | ContentId | AirDate |
+-------+-----------+------------+
| 91 | 1 | 2015-01-01 |
| 92 | 2 | 2015-01-01 |
| 93 | 3 | 2015-01-01 |
| 94 | 4 | 2015-01-01 |
+-------+-----------+------------+
Есть некоторые довольно очевидные проблемы с этим, но обратите внимание, что мой вопрос не в том, как исправить это. Просто, есть ли для этого специальный c термин? Я хочу назвать это чем-то вроде «игнорирование взаимосвязи данных» или «игнорирование ссылочного контекста». Возможно, это не совсем антипаттерн база данных , поскольку в моем примере есть внешний субъект, вставляющий лишние строки.