Допустима ли денормализация в этом случае? - PullRequest
0 голосов
/ 06 сентября 2010

У меня есть следующая locations таблица:

----------------------------------------------------------
| ID | zoneID | storeID | address | latitude | longitude |
----------------------------------------------------------

и таблица phones:

-----------------------
| locationID | number |
-----------------------

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

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

Теперь к этой новой таблице не применяется locationID, поэтому мы не можем сохранить телефоны в предыдущей телефонной таблице.

Для нормализации БД потребуются, в конце концов, 2 новые таблицы и всего 4 объединения для извлечения данных. Если денормализовать его, старая таблица будет выглядеть так:

----------------------------------------------------------------------------------
| ID | zoneID | storeID | address | latitude | longitude | phone1 | ... | phone5 |
----------------------------------------------------------------------------------

и имеет в общей сложности 2 таблицы и 2 объединения.

Я не фанат полей data1, data2, data3, так как это может быть огромной болью. Итак, что ты думаешь?

Ответы [ 3 ]

7 голосов
/ 06 сентября 2010

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

Это не то, что вы делаете, чтобы ваши запросы выглядели лучше. Любой приличный разработчик баз данных не будет бояться умеренно сложного оператора SQL, хотя я должен признать, что видел несколько многострочных операторов, которые вызывали у меня дрожь - заметьте, это были клиенты, которые не контролировали схему: Администратор БД сначала перепроектировал бы схему, чтобы избежать такого уродства.

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

Я вижу следующие непосредственные ограничения (могут быть и другие):

  • Вы будете ограничены (изначально без изменения схемы) пятью телефонными номерами в каждом местоположении. Из вашего описания не видно, что вы видите это как проблему.
  • Вы будете тратить пространство на хранение данных, которых там не должно быть. Другими словами, каждая строка использует пространство для пяти чисел независимо от того, что они на самом деле имеют, хотя это влияние, вероятно, минимально (например, если они varchar и nullable).
  • Ваши запросы для поиска номера телефона будут сложными, так как вам придется проверить пять разных столбцов. Является ли это одним из ваших вариантов использования, я не знаю, так что это может быть неактуально.

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

4 голосов
/ 06 сентября 2010

Я думаю, что ваша проблема проистекает из ошибочной модели.

Почему у вас есть идентификатор местоположения и идентификатор магазина? Может ли магазин занимать более одного места? Номер телефона привязан к географическому местоположению?

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

0 голосов
/ 06 сентября 2010

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

Связать новую таблицу со старой таблицей местоположений поможет вам не только получить телефонные номера

...