2013-12-05 3 views
2

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

На стороне базы данных,

Каждый пользователь будет связан с 1 штатом, 1 городом и рядом районов в пределах этого состояния/города. Например, Пользователь А может быть связан с «Нью-Йорк» и «Бруклин» и любым количеством X районов в «Бруклине» (или нет).

На виде сбоку,

Я хотел бы представить выбор района с флажками поэтому они должны быть в состоянии вырваться из поля базы данных с simple_form в Rails довольно легко.

Дизайн базы данных должен упростить запрос для пользователя и получить связанные с ним отношения между штатами/городами и районами, которые пользователь выбрал.

Одна из моих идей - просто иметь поле «один ко многим» для районов и таблицу округов, в которой перечислены все разные районы. Однако существует ли способ обеспечить, чтобы районы были действительными для объединения города/государства на бэкэнд с использованием валидации?

Любые советы будут оценены.

ответ

3

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

Каждый город относится к одному государству.

cities 
    id    unsigned int(P) 
    state_id  unsigned int(F states.id) 
    name   varchar(50) 

+----+----------+---------------+ 
| id | state_id | name   | 
+----+----------+---------------+ 
| 1 |  33 | New York City | 
| .. | ........ | ............. | 
+----+----------+---------------+ 

См. ISO 3166 для получения дополнительной информации. Вы не просили страны, но их тривиально добавить ...

countries 
    id   char(2)(P) 
    iso3  char(3)(U) 
    iso_num  char(3)(U) 
    name  varchar(45)(U) 

+----+------+---------+---------------+ 
| id | iso3 | iso_num | name   | 
+----+------+---------+---------------+ 
| ca | can |  124 | Canada  | 
| mx | mex |  484 | Mexico  | 
| us | usa |  840 | United States | 
| .. | .... | ....... | ............. | 
+----+------+---------+---------------+ 

Каждый район относится к одному городу.

districts 
    id   unsigned int(P) 
    city_id  unsigned int(F cities.id) 
    name  varchar(50) 

+----+---------+-----------+ 
| id | city_id | name  | 
+----+---------+-----------+ 
| 1 |  1 | The Bronx | 
| 2 |  1 | Brooklyn | 
| 3 |  1 | Manhattan | 
| .. | ....... | ......... | 
+----+---------+-----------+ 

Для получения дополнительной информации см. ISO 3166-2:US.Каждое государство принадлежит к одной стране.

states 
    id   unsigned int(P) 
    country_id char(2)(F countries.id) 
    code  char(2) 
    name  varchar(50) 

+----+------------+------+----------+ 
| id | country_id | code | name  | 
+----+------------+------+----------+ 
| 1 | us   | AL | Alabama | 
| .. | .......... | .... | ........ | 
| 33 | us   | NY | New York | 
| .. | .......... | .... | ........ | 
+----+------------+------+----------+ 

На основании вашей информации пользователь принадлежит к одному городу. В примере данные Боб ассоциируется с Нью-Йорком. Присоединившись к столам, вы можете легко найти, что Боб находится в штате Нью-Йорк и в стране Соединенных Штатов.

users 
    id   unsigned int(P) 
    username varchar(255) 
    city_id  unsigned int(F cities.id) 
    ... 

+----+----------+---------+-----+ 
| id | username | city_id | ... | 
+----+----------+---------+-----+ 
| 1 | bob  |  1 | ... | 
| .. | ........ | ....... | ... | 
+----+----------+---------+-----+ 

Пользователи могут принадлежать любому числу районов. В примере данные Боб принадлежит Бронксу и Бруклину. user_id и district_id образуют первичный ключ, который гарантирует, что пользователь не может быть связан с одним и тем же округом более одного раза.

users_districts 
    user_id   unsigned int(F users.id)  \_(P) 
    district_id  unsigned int(F districts.id)/

+---------+-------------+ 
| user_id | district_id | 
+---------+-------------+ 
|  1 |   1 | 
|  1 |   2 | 
| ....... | ........... | 
+---------+-------------+ 

Моя модель базы данных не устанавливает правило, согласно которому районы пользователя принадлежит должен быть в городе, который принадлежит пользователю - на моем взгляде, что логика должна быть сделана на уровне приложений. Если Боб переезжает из Нью-Йорка в Балтимор, я думаю, что все его записи должны быть удалены из таблицы users_districts, а затем добавить новые для своего нового города.

Что касается пользовательского интерфейса, я бы пользователя:

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

Вам понадобится комбинация базы данных и логики уровня приложения.

Вот как я хотел бы построить поля базы данных:

users = id, <other user fields>, city_id 
districts = id, <other district fields>, city_id 
cities = id, name, state_id 
states = id, name 

, а затем в приложении, установите его так, что пользователь может ввести в один город и несколько районов, а может не отредактировать состояние (только просмотр):

  1. Когда пользователь в городе - может быть, через autocomplete поле - он автоматически обновляет состояние поля только для чтения с состоянием города
  2. Когда пользователь в районе, список только районы, которые district.city_id == cities.id

Если вы не хотите, чтобы ограничить выбор района в пользовательском интерфейсе, вам нужно будет провести в жизнь District.city_id == cities.id проверяет ваше приложение, хотя лично я считаю, что это менее интуитивно понятно, чем делать это прямо в интерфейсном интерфейсе.

Смежные вопросы