州,市和区的数据库设计

时间:2013-12-05 22:41:33

标签: ruby-on-rails database database-design

我有用户表中的用户,需要设计一个模型,将它们与他们选择的州/城市/地区相关联:

在数据库方面,

每个用户将与该州/城市组合中的1个州,1个城市和多个地区相关联。例如,用户A可以选择与“纽约”和“布鲁克林”以及“布鲁克林”(或没有)中任何X个区域相关联。

在视图方面,

我想用复选框呈现区域选项,这样它们就可以很容易地从Rails中的simple_form从数据库字段中提取出来。

数据库的设计应该可以轻松查询用户并获得用户选择的相关州/城市和地区关系。

我的一个想法就是只为区域设置一对多的字段,并列出所有不同区域的区域表。但是,有没有办法强制区域必须使用验证对后端的城市/州组合有效?

任何提示都将不胜感激。

3 个答案:

答案 0 :(得分: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 |
| .. | .......... | .... | ........ |
+----+------------+------+----------+

根据您的信息,用户只属于一个城市。在示例数据中,Bob与纽约市相关联。通过加入表格,您可以很容易地发现Bob位于纽约州和美国。

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

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

用户可以属于任意数量的地区。在示例数据中,Bob属于The Bronx和Brooklyn。 user_iddistrict_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 |
| ....... | ........... |
+---------+-------------+

我的数据库模型没有强制规定用户所属的区域必须位于用户所属的城市 - 我认为逻辑应该在应用程序级别完成。如果Bob从纽约市搬到巴尔的摩,我认为他的所有记录都应该从users_districts表中删除,然后为他的新城市添加任何新记录。

对于用户界面,我会有用户:

  1. 选择一个国家/地区 - 这将自动填充关联州的下拉列表。
  2. 选择一个州 - 这将自动填充关联城市的下拉列表。
  3. 选择一个城市 - 这将自动填充相关区域的列表。
  4. 允许用户选择任意数量的区域。

答案 1 :(得分: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
  3. 的区域

    如果您不想在UI中限制区域选择,则需要在应用程序中强制执行district.city_id == cities.id检查,但我个人认为这不如在前端用户界面。

答案 2 :(得分:0)

印度国家和UT MySQL查询

INSERT INTO `states`
VALUES
  (1,'Andhra Pradesh'),
  (2,'Telangana'),
  (3,'Arunachal Pradesh'),
  (4,'Assam'),
  (5,'Bihar'),
  (6,'Chhattisgarh'),
  (7,'Chandigarh'),
  (8,'Dadra and Nagar Haveli'),
  (9,'Daman and Diu'),
  (10,'Delhi'),
  (11'Goa'),
  (12,'Gujarat'),
  (13,'Haryana'),
  (14,'Himachal Pradesh'),
  (15,'Jammu and Kashmir'),
  (16,'Jharkhand'),
  (17,'Karnataka'),
  (18,'Kerala'),
  (19,'Madhya Pradesh'),
  (20,'Maharashtra'),
  (21,'Manipur'),
  (22,'Meghalaya'),
  (23,'Mizoram'),
  (24,'Nagaland'),
  (25,'Orissa'),
  (26,'Punjab'),
  (27,'Pondicherry'),
  (28,'Rajasthan'),
  (29,'Sikkim'),
  (30,'Tamil Nadu'),
  (31,'Tripura'),
  (32,'Uttar Pradesh'),
  (33,'Uttarakhand'),
  (34,'West Bengal'),
  (35,'Lakshadweep'),
  (36,'Ladakh ');