省,市,镇,村 四级字典表怎样建表呢

yuna@liu 2011-11-10 11:44:10
最近在做一个当档案管理系统

在用户所属地的地方建表犯难了。

--省
create table Province
(
pid int ,
Province_name varchar2(50)
)
--市
create table City
(
cid int ,
city_name varchar2(50),
pid int --外键省id
)
--城镇
create table Town
(
tid int ,
town_name varchar2(50),
cid int --外键市id
)
--村
create table Village
(
vid int ,
village_name varchar2(50),
tid int --外键镇id
)
--用户档案表
create table Archives
(
id int ,
a_name varchar2(50),--姓名
a_sex char(1),--性别
........
vid int ---外键村id
)

我这样oracle建的数据库表
但是现在有一个问题是:
比如:查询档案表Archives所有用户时。除了显示姓名,性别等,同时要显示用户所属省名,市,镇和村名。
在档案表Archives中,怎样利用vid (村id) 同时查出省,市,镇,村。
写一个什么样的sql语句 来实现最高速呢

或者那位作过类似的系统。有其他的建表结构的意见吗?
...全文
279 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuna@liu 2011-11-10
  • 打赏
  • 举报
回复
xpingping 说的办法不错呢,不过想了下,这边的身份 证也有15 位的。所以用不了这种的办法
yuna@liu 2011-11-10
  • 打赏
  • 举报
回复
o 呵呵 那如果是access 数据库呢,也能按以上的那种写法吗?
xpingping 2011-11-10
  • 打赏
  • 举报
回复
--用户档案表
create table Archives
(
id int ,
a_name varchar2(50),--姓名
a_sex char(1),--性别
........
vid int ---外键村id
)

红字部分id varchar2(18),个人觉得模仿身份证号码
1-2位是省的代号
3-4位是市的代号
5-6位是县的代号
7-14位是出生年月日
15-16位是当地派出所的代号
17为为性别代号(奇数男,偶数女),
18校验码(0-9随机)
这样外键vid int ---外键村id可以去除
通过截取id的位数来获取省、市、镇、村的信息
007-x 2011-11-10
  • 打赏
  • 举报
回复
不会的,这几个表里面的资料应该都比较少,而且都是主外键关联查询,对oracle来说没什么影响.
yuna@liu 2011-11-10
  • 打赏
  • 举报
回复
谢谢两位朋友,
LuiseRADL 说的“创建档案表是,加入省、市、镇、村的id”
这样的话,如果省、市、镇、村如果之间的关系有变动的话,同时也要修改档案表了,譬如说把某一村从一个镇移到另一个镇。这样档案表也同时要修改省、市、镇、村的id。这样的话,是不是比较麻烦呢?

---
还有一个问题是,现在除了给档案加上地市。同时还要给档案加上存储位置(譬如:仓,房,架,箱),也是四级(和省、市、镇、村之间的逻辑关系一样)。
现在也要显示档案的存储位置。

CREATE OR REPLACE VIEW v_village
AS
SELECT p.ID, p.province_name, c.cid, c.city_name, t.tid, t.town_name,
v.vid, v.village_name
FROM province p, city c, town t, village v
WHERE v.tid = t.tid AND t.cid = c.cid AND c.ID = p.ID

这上面已经级联了4张表了。
如果同时显示存储位置 ,那这样一来 ,那在查询语句里面一共要级联8张表,这样的话查询速度是不是要受很大影响呢
我心飞翔 2011-11-10
  • 打赏
  • 举报
回复
在创建档案表是,加入省、市、镇、村的id
007-x 2011-11-10
  • 打赏
  • 举报
回复
建一个视图比较方便,这样你就可以用Archives中的vid来v_village中查省,市,镇,村
CREATE OR REPLACE VIEW v_village
AS
SELECT p.ID, p.province_name, c.cid, c.city_name, t.tid, t.town_name,
v.vid, v.village_name
FROM province p, city c, town t, village v
WHERE v.tid = t.tid AND t.cid = c.cid AND c.ID = p.ID

select * from Archives a,v_village v where a.vid=v.vid
wanghaoitfk 2011-11-10
  • 打赏
  • 举报
回复
个人省,市,城镇,村,单建表可以方便其它地方调用

但是在用户档案表中,建议有存省,市,城镇,村的ID字段

这样的话以后查询数据的时候也方便一些,不然到时候串联的多了,效率是一个问题,数据检索也是问题
forgetsam 2011-11-10
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 liuxiulian 的回复:]
恩 forgetsam 这个办法不错呢

但是这样我要查用户信息,地市信息怎么
写级联语句呢?
[/Quote]
如果非Oracle:
  select
c1.name as 村名,
c2.name as 镇名,
c3.name as 市名,
c4.name as 省名,
z.* from 用户主表 z
left join 地址代码表 c1 on z.村ID = c1.id
left join 地址代码表 c2 on c1.pid = c2.id
left join 地址代码表 c3 on c2.pid = c3.id
left join 地址代码表 c4 on c3.pid = c4.id

Oracle 数据库用 connect by 搞定
yuna@liu 2011-11-10
  • 打赏
  • 举报
回复
恩 forgetsam 这个办法不错呢

但是这样我要查用户信息,地市信息怎么
写级联语句呢?
xpingping 2011-11-10
  • 打赏
  • 举报
回复
同意LuiseRADL 的说法,我的那个方法好像不是很实际,考虑得不够长远

我心飞翔 2011-11-10
  • 打赏
  • 举报
回复
“这样的话,如果省、市、镇、村如果之间的关系有变动的话,同时也要修改档案表了”

那当然是需要修改了啊。
这个东西都是相对稳定的啊,如果特殊情况下有改动,可以考虑使用触发器,当它们之间的关系改变时,可以在触发器中对档案中的记录自动进行调整。

“还有一个问题是,现在除了给档案加上地市。同时还要给档案加上存储位置”
那就再加4个ID罢。

性能上没有太大的影响。
xpingping 2011-11-10
  • 打赏
  • 举报
回复
额……给力哇,
提供2种方法
1)id varchar(19)
录入数据时如果是18为的身份证 为x+身份证号码
如果是15为的身份证 y+身份证号
x就18的身份证编码方式
y就15的身份证编码方式

2)在 用户档案表 加个字段 flag varchar(1), o为18,1为15
flag =o 就18的身份证编码方式
flag =1 就15的身份证编码方式

forgetsam 2011-11-10
  • 打赏
  • 举报
回复
你的字典层数是不是不会变了,只要不变,把4级地域 放在一张表里 4级存放地 放在一张表里

结构:ID 名称 父ID
007-x 2011-11-10
  • 打赏
  • 举报
回复
access不知道额,只闻其名,不见其用. 估计还可以的,只要数据量不大

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧