Модель данных страны / региона / города - PullRequest
3 голосов
/ 25 июля 2011

Страна: идентификатор страны, название страныРегион: regionID, countryID (FK), regionNameГород: cityID, regionID (FK), cityName

  1. Во всех странах будут города.
  2. Не во всех странах будут регионы.Регион будет содержать только те строки, которые имеют идентификатор страны.Существует только одна строка, в которой указан идентификатор региона 9999, а название страны равно NULL. Имя региона равно НЕТ.
  3. В любом городе нет идентификатора региона, будет указано 9999 идентификатора региона.

ФронтКонечный сценарий:

  1. Пользователь выбирает страну из выпадающего списка
  2. Заполняется раскрывающийся список регионов
  3. Заполняется раскрывающийся город - только город относится к региону

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

Я мог бы просто поместить countryID и regionID в таблицу City.Однако мне нужно ваше предложение.

Какое наилучшее решение / дизайн будет устойчивым в долгосрочной перспективе?

Ответы [ 5 ]

3 голосов
/ 25 июля 2011

Если:

Во всех странах будут города.

и:

Не во всех странах будут регионы.

затем:

просто поместите countryID и regionID в таблицу City

- наиболее очевидный способ его моделирования.Как вы предлагаете, это не иерархическая модель.Существует 3 отдельных отношения:

  • Город в регионе
  • Город в стране
  • Регион в стране

Поэтому вам необходимо захватитьих явно.Однако вам потребуется логика для обеспечения согласованности, то есть для предотвращения таких ситуаций, как:

  • «Бирмингем» (город) находится в «Уэст-Мидлендс» (регион)
  • «Бирмингем»находится в «Соединенном Королевстве» (Страна)
  • «Уэст-Мидлендс» находится в «Франции» (Страна).

Другим вариантом будет захват стран и регионов в одной таблице., давайте назовем это Area:

AreaID     Name             Type    ParentID
001    'UnitedKingdom'    'Country'   NULL
002    'West Midlands'    'Region'    001

Это устранит проблему, описанную выше.В каждом городе есть один обязательный FK в таблице Area, указывающий на запись «Страна» или «Регион» в зависимости от ситуации.Это также обеспечивает большую гибкость в иерархии;Например, можно добавить регионы внутри регионов (если необходимо) и / или добавить другие типы областей (например, Континент).Однако вам все равно нужно будет применить некоторую логику (например, нельзя добавить регион в качестве родителя страны).

Любое решение может сработать;что лучше всего, будет зависеть от других требований (например, количество записей против количества чтений).

hth.

0 голосов
/ 08 апреля 2019

Я предпочитаю оригинальный вариант: tblCountry -> tblRegion -> tblCity.Если регион не существует, укажите Регион = Страна и установите флажок, чтобы указать, что регион не существует, и игнорируйте повторяющиеся записи.Просто мысль.

0 голосов
/ 25 июля 2011

У вас есть две разные проблемы здесь.

  • Проблема проектирования базы данных (как моделировать названия городов)
  • Проблема дизайна пользовательского интерфейса (как пользователь должен вводить названия городов)

Хотя эти две проблемы в некоторой степени взаимодействуют, они на самом деле не имеют ничего общего друг с другом.

Что касается дизайна базы данных, «полное имя» Сан-Франциско -

San Francisco, California, United States of America

Это отличает его, скажем, от San Francisco, Alabama, United States of America, которого даже не существует.

И, если пойти еще дальше, полное название Калифорнии будет

California, United States of America

Это отличает его, скажем, от California, Scotland, которого также не существует.

Предлагает ли это вам полезный подход?

0 голосов
/ 25 июля 2011

Что ж, если вы поместите regionID в вашу таблицу городов, и если у вас нет региона, он будет также нулевым в вашей таблице городов. Так что никакой выгоды.

Вы спрашиваете о 0-Отношение ко-многим, представляющее собой отношение «1-ко-многим» в специальной форме. Вы можете разрешить NULL для части региона.Ваш предыдущий дизайн выполним в долгосрочной перспективе, если в будущем у вашей страны 'X' будут регионы.

0 голосов
/ 25 июля 2011

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

...