【问题标题】:Database Design for state, cities and districts州、市、区的数据库设计
【发布时间】:2013-12-05 22:41:33
【问题描述】:

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

在数据库方面,

每个用户将与 1 个州、1 个城市以及该州/城市组合内的多个地区相关联。例如,用户 A 可以选择与“NY”和“Brooklyn”以及“Brooklyn”中的任意 X 个地区关联(或不关联)。

在视图方面,

我想用复选框来显示地区选择,这样它们应该可以很容易地从 Rails 中的 simple_form 数据库字段中提取出来。

数据库的设计应便于查询用户,获取用户选择的相关州/市、区关系。

我的一个想法是简单地为地区提供一个一对多的字段和一个列出所有不同地区的地区表。但是,有没有办法使用 validate 来强制地区必须对后端的城市/州组合有效?

任何提示将不胜感激。

【问题讨论】:

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


    【解决方案1】:

    下面我根据您提供的信息概述了我将使用的数据库架构。

    每个城市都属于一个州。

    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. 允许用户选择任意数量的地区。

    【讨论】:

      【解决方案2】:

      您将需要数据库和应用程序级逻辑的某种组合。

      这是我将如何构建数据库字段:

      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 ==ities.id 的区

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

      【讨论】:

        【解决方案3】:

        印度各州和 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 ');
        

        【讨论】:

        • 这不是试图回答这个问题。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-23
        • 1970-01-01
        • 2018-08-27
        • 1970-01-01
        • 1970-01-01
        • 2014-01-27
        • 1970-01-01
        相关资源
        最近更新 更多