我有用户表中的用户,需要设计一个模型,将它们与他们选择的州/城市/地区相关联:
在数据库方面,
每个用户将与该州/城市组合中的1个州,1个城市和多个地区相关联。例如,用户A可以选择与“纽约”和“布鲁克林”以及“布鲁克林”(或没有)中任何X个区域相关联。
在视图方面,
我想用复选框呈现区域选项,这样它们就可以很容易地从Rails中的simple_form从数据库字段中提取出来。
数据库的设计应该可以轻松查询用户并获得用户选择的相关州/城市和地区关系。
我的一个想法就是只为区域设置一对多的字段,并列出所有不同区域的区域表。但是,有没有办法强制区域必须使用验证对后端的城市/州组合有效?
任何提示都将不胜感激。
答案 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_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 |
| ....... | ........... |
+---------+-------------+
我的数据库模型没有强制规定用户所属的区域必须位于用户所属的城市 - 我认为逻辑应该在应用程序级别完成。如果Bob从纽约市搬到巴尔的摩,我认为他的所有记录都应该从users_districts
表中删除,然后为他的新城市添加任何新记录。
对于用户界面,我会有用户:
答案 1 :(得分:1)
您需要一些数据库和应用程序级逻辑的组合。
以下是我将如何构建数据库字段:
users = id, <other user fields>, city_id
districts = id, <other district fields>, city_id
cities = id, name, state_id
states = id, name
然后在应用程序中进行设置,以便用户可以键入一个城市和多个区域,并且不编辑状态(仅查看):
如果您不想在UI中限制区域选择,则需要在应用程序中强制执行district.city_id == cities.id检查,但我个人认为这不如在前端用户界面。
答案 2 :(得分:0)
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 ');