数据库中记录国家省份城市信息,应该使用哪种表的设计方式。 关系数据库中要记录国家、省份、城市、县区 四种信息,他们之间有对应关系。请问应该设计成四个表的形式还是像一般的多级目录的形式存放在一个表中?他们之间有什么优缺点,或者有没有更好的数据库表结构设计?我是新手,见笑了。希望各位大侠能解答。。谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 本帖最后由 yueliangdao0608 于 2009-09-07 03:08:51 编辑 location_id location_name001 江苏001001 南京001001001 白下区location_id char(15) 3个字符一分. 检索也方便查询完整路径的时候 采用缓存,将地区表缓存入文件. 一个表两个字段:citys(code[int],name[nvarchar])code分为4部分如:7bit8bit+8bit+8bit,应该根据实际情况划分.这样即有利于索引,树状层次也清晰,我认为这种结构综合效率是最高的. 看看这篇文章:http://www.mscto.com/database/2009010134465.html id,parent_id,region_grade, --省市区县属于哪一级region_name, --中文名称district_code, --邮编area_code, --区号status --是否有效 ecshop里面不就有一个吗,这样挺好的。mysql> desc ecs_region;+-------------+----------------------+------+-----+---------+----------------+| Field | Type | Null | Key | Default | Extra |+-------------+----------------------+------+-----+---------+----------------+| region_id | smallint(5) unsigned | NO | PRI | NULL | auto_increment || parent_id | smallint(5) unsigned | NO | MUL | 0 | || region_name | varchar(120) | NO | | | || region_type | tinyint(1) | NO | MUL | 2 | || agency_id | smallint(5) unsigned | NO | MUL | 0 | |+-------------+----------------------+------+-----+---------+----------------+5 rows in set (0.05 sec)mysql> select * from ecs_region limit 0 ,30;+-----------+-----------+-------------+-------------+-----------+| region_id | parent_id | region_name | region_type | agency_id |+-----------+-----------+-------------+-------------+-----------+| 1 | 0 | 中国 | 0 | 0 || 2 | 1 | 北京 | 1 | 0 || 3 | 1 | 安徽 | 1 | 0 || 4 | 1 | 福建 | 1 | 0 || 5 | 1 | 甘肃 | 1 | 0 || 6 | 1 | 广东 | 1 | 0 || 7 | 1 | 广西 | 1 | 0 || 8 | 1 | 贵州 | 1 | 0 || 9 | 1 | 海南 | 1 | 0 || 10 | 1 | 河北 | 1 | 0 || 11 | 1 | 河南 | 1 | 0 || 12 | 1 | 黑龙江 | 1 | 0 || 13 | 1 | 湖北 | 1 | 0 || 14 | 1 | 湖南 | 1 | 0 || 15 | 1 | 吉林 | 1 | 0 || 16 | 1 | 江苏 | 1 | 0 || 17 | 1 | 江西 | 1 | 0 || 18 | 1 | 辽宁 | 1 | 0 || 19 | 1 | 内蒙古 | 1 | 0 || 20 | 1 | 宁夏 | 1 | 0 || 21 | 1 | 青海 | 1 | 0 || 22 | 1 | 山东 | 1 | 0 || 23 | 1 | 山西 | 1 | 0 || 24 | 1 | 陕西 | 1 | 0 || 25 | 1 | 上海 | 1 | 0 || 26 | 1 | 四川 | 1 | 0 || 27 | 1 | 天津 | 1 | 0 || 28 | 1 | 西藏 | 1 | 0 || 29 | 1 | 新疆 | 1 | 0 || 30 | 1 | 云南 | 1 | 0 |+-----------+-----------+-------------+-------------+-----------+30 rows in set (0.00 sec)我觉得这个挺好的。 我建议就以国标的行政区划代码(就是身份证前6位)保存省市县信息,区划代码可以用树形分类表或xml保存我原来做过一个查身份证归属地的,用的就是xml<?xml version="1.0" encoding="UTF-8" standalone="yes" ?><jnkcAddrCode date="2006-5-27"> <p id="110000" t="北京市"> <c id="110100" t="市辖区"> <d id="110101" t="东城区" /> <d id="110102" t="西城区" /> <d id="110103" t="崇文区" /> <d id="110104" t="宣武区" /> <d id="110105" t="朝阳区" /> <d id="110106" t="丰台区" /> <d id="110107" t="石景山区" /> <d id="110108" t="海淀区" /> <d id="110109" t="门头沟区" /> <d id="110111" t="房山区" /> <d id="110112" t="通州区" /> <d id="110113" t="顺义区" /> <d id="110114" t="昌平区" /> <d id="110115" t="大兴区" /> <d id="110116" t="怀柔区" /> <d id="110117" t="平谷区" /> </c> <c id="110200" t="县"> <d id="110221" t="昌平县" ni="110114" nt="昌平区" y="1999" /> <d id="110224" t="大兴县" ni="110115" nt="大兴区" y="2001" /> <d id="110226" t="平谷县" ni="110117" nt="平谷区" y="2001" /> <d id="110227" t="怀柔县" ni="110116" nt="怀柔区" y="2001" /> <d id="110228" t="密云县" /> <d id="110229" t="延庆县" /> </c> </p>...... <p id="710000" t="台湾省" /> <p id="810000" t="香港特别行政区" /> <p id="820000" t="澳门特别行政区" /></jnkcAddrCode> 这个问题都不能算是问题,可以不放在web目录下,也可以加一句php防止直接访问。 在Linux上备份的PostgreSQL文件,不能在windows里恢复吗? 如何实现在一个库部分的表自增长是1 另外一部分自增长是2 MYSQL同步问题,卡死在这里了[93全分送出] 在windows XP下如何利用ODBC数据源连接到postgreSQL数据库? 关于mysql的master当掉后自动切换问题 在mysql中如何比较2个16进制数字? 请问远程登录链接mysql数据库的安全有问题吗? 请问MYSQL地数据库容量是自动增加地吗? 该变字符集地命令是怎样写地呀 mysql 分表问题:性能没有提升 mysql 函数或过程的性能问题 mysql>show databases没反应 关于mysql子查询的问题。
001 江苏
001001 南京
001001001 白下区location_id char(15) 3个字符一分. 检索也方便查询完整路径的时候 采用缓存,将地区表缓存入文件.
code分为4部分如:7bit8bit+8bit+8bit,应该根据实际情况划分.
这样即有利于索引,树状层次也清晰,我认为这种结构综合效率是最高的.
parent_id,
region_grade, --省市区县属于哪一级
region_name, --中文名称
district_code, --邮编
area_code, --区号
status --是否有效
+-------------+----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------------------+------+-----+---------+----------------+
| region_id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| parent_id | smallint(5) unsigned | NO | MUL | 0 | |
| region_name | varchar(120) | NO | | | |
| region_type | tinyint(1) | NO | MUL | 2 | |
| agency_id | smallint(5) unsigned | NO | MUL | 0 | |
+-------------+----------------------+------+-----+---------+----------------+
5 rows in set (0.05 sec)
mysql> select * from ecs_region limit 0 ,30;
+-----------+-----------+-------------+-------------+-----------+
| region_id | parent_id | region_name | region_type | agency_id |
+-----------+-----------+-------------+-------------+-----------+
| 1 | 0 | 中国 | 0 | 0 |
| 2 | 1 | 北京 | 1 | 0 |
| 3 | 1 | 安徽 | 1 | 0 |
| 4 | 1 | 福建 | 1 | 0 |
| 5 | 1 | 甘肃 | 1 | 0 |
| 6 | 1 | 广东 | 1 | 0 |
| 7 | 1 | 广西 | 1 | 0 |
| 8 | 1 | 贵州 | 1 | 0 |
| 9 | 1 | 海南 | 1 | 0 |
| 10 | 1 | 河北 | 1 | 0 |
| 11 | 1 | 河南 | 1 | 0 |
| 12 | 1 | 黑龙江 | 1 | 0 |
| 13 | 1 | 湖北 | 1 | 0 |
| 14 | 1 | 湖南 | 1 | 0 |
| 15 | 1 | 吉林 | 1 | 0 |
| 16 | 1 | 江苏 | 1 | 0 |
| 17 | 1 | 江西 | 1 | 0 |
| 18 | 1 | 辽宁 | 1 | 0 |
| 19 | 1 | 内蒙古 | 1 | 0 |
| 20 | 1 | 宁夏 | 1 | 0 |
| 21 | 1 | 青海 | 1 | 0 |
| 22 | 1 | 山东 | 1 | 0 |
| 23 | 1 | 山西 | 1 | 0 |
| 24 | 1 | 陕西 | 1 | 0 |
| 25 | 1 | 上海 | 1 | 0 |
| 26 | 1 | 四川 | 1 | 0 |
| 27 | 1 | 天津 | 1 | 0 |
| 28 | 1 | 西藏 | 1 | 0 |
| 29 | 1 | 新疆 | 1 | 0 |
| 30 | 1 | 云南 | 1 | 0 |
+-----------+-----------+-------------+-------------+-----------+
30 rows in set (0.00 sec)
我觉得这个挺好的。
我原来做过一个查身份证归属地的,用的就是xml
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<jnkcAddrCode date="2006-5-27">
<p id="110000" t="北京市">
<c id="110100" t="市辖区">
<d id="110101" t="东城区" />
<d id="110102" t="西城区" />
<d id="110103" t="崇文区" />
<d id="110104" t="宣武区" />
<d id="110105" t="朝阳区" />
<d id="110106" t="丰台区" />
<d id="110107" t="石景山区" />
<d id="110108" t="海淀区" />
<d id="110109" t="门头沟区" />
<d id="110111" t="房山区" />
<d id="110112" t="通州区" />
<d id="110113" t="顺义区" />
<d id="110114" t="昌平区" />
<d id="110115" t="大兴区" />
<d id="110116" t="怀柔区" />
<d id="110117" t="平谷区" />
</c>
<c id="110200" t="县">
<d id="110221" t="昌平县" ni="110114" nt="昌平区" y="1999" />
<d id="110224" t="大兴县" ni="110115" nt="大兴区" y="2001" />
<d id="110226" t="平谷县" ni="110117" nt="平谷区" y="2001" />
<d id="110227" t="怀柔县" ni="110116" nt="怀柔区" y="2001" />
<d id="110228" t="密云县" />
<d id="110229" t="延庆县" />
</c>
</p>
...
... <p id="710000" t="台湾省" />
<p id="810000" t="香港特别行政区" />
<p id="820000" t="澳门特别行政区" />
</jnkcAddrCode>
这个问题都不能算是问题,可以不放在web目录下,也可以加一句php防止直接访问。