Денормализация приемлема в этом случае?
У меня есть следующее 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 ответа
Мое мнение, что бы это ни стоило, это то, что вы делаете дестабилизацию, чтобы повысить производительность, если и только если у вас действительно есть проблема с производительностью. Я всегда проектирую для 3NF и возвращаюсь только в случае крайней необходимости.
Это не то, что вы делаете, чтобы ваши запросы выглядели лучше. Любой приличный разработчик баз данных не боится достаточно сложного SQL-оператора, хотя я должен признать, что видел несколько многострочных операторов, которые вызывали у меня дрожь - заметьте, они были от клиентов, которые не контролировали схему: Администратор базы данных сначала пересмотрел бы схему, чтобы избежать такого уродства.
Но до тех пор, пока вы довольны ограничениями, налагаемыми ненормализацией, вы можете делать все, что захотите. Это не так, как будто группа 3NF полиции бродит по планете в поисках нарушителей:-)
Непосредственные ограничения (могут быть и другие), которые я вижу:
- Вы будете ограничены (изначально, без изменения схемы) пятью телефонными номерами для каждого местоположения. Из вашего описания не видно, что вы видите это как проблему.
- Вы будете тратить пространство на хранение данных, которых там не должно быть. Другими словами, каждая строка использует пространство для пяти чисел независимо от того, что они на самом деле имеют, хотя это влияние, вероятно, минимально (например, если они varchar и nullable).
- Ваши запросы для поиска номера телефона будут сложными, так как вам придется проверить пять разных столбцов. Является ли это одним из ваших вариантов использования, я не знаю, так что это может быть неактуально.
Вы, вероятно, должны выбрать один или другой путь, хотя (я не уверен, что это ваше намерение здесь). Я был бы особенно раздражен, если бы наткнулся на схему, в которой номера телефонов содержались как в таблице магазинов, так и в отдельной таблице телефонных номеров, особенно если они не соглашались друг с другом. Даже когда я отменяю нормализацию, я склонен использовать триггеры вставки / обновления, чтобы обеспечить согласованность данных.
Я думаю, что ваша проблема проистекает из ошибочной модели.
Почему у вас есть идентификатор местоположения и идентификатор магазина? Может ли магазин занимать более одного места? Номер телефона привязан к географическому местоположению?
Просто введите все с помощью StoreId, и ваши проблемы исчезнут.
Просто попытайтесь связать вашу новую таблицу со старой таблицей местоположений, так как обе таблицы представляют магазин, который вы сможете найти, чтобы связать оба. если вы можете сделать это, ваша проблема решена, потому что вы можете продолжать использовать телефонный стол, как и раньше.
Связанная новая таблица со старой таблицей местоположения поможет вам не только получить номера телефонов