Как называется антипаттерн, ссылающийся на данные? - PullRequest
0 голосов
/ 19 июня 2020

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

Допустим, у меня есть база данных телешоу. Его основная таблица 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 термин? Я хочу назвать это чем-то вроде «игнорирование взаимосвязи данных» или «игнорирование ссылочного контекста». Возможно, это не совсем антипаттерн база данных , поскольку в моем примере есть внешний субъект, вставляющий лишние строки.

...