作者musie (Sirius)
看板Database
标题Re: [问题] 新手,想进步。
时间Sun Feb 5 11:23:37 2012
※ 引述《LaPass (LaPass)》之铭言:
: 自己刚开始使用 SQL SERVER 2008
: 以前都是使用MySQL,所以用的都只是简单的语法
: 例如:SELECT * FROM table INNER JOIN table2 ON ... WHERE... ORDER BY
: 像这种而已
: 开始用SQL SERVER 之後
: 发现SQL SERVER似乎可以只靠SQL 语法就去做到许多事
: 於是想开始学习这一块
: 最近接获一项任务,目标表格是长这样
用正规化解法
1.taTable
taID(PK)
1
2
3
4
5
6
2.ta-GroupTable
taID(FK) groupID(FK)
1 0(所有成员)
2 1(地球)
2 3(台中市)
2 4 ...
4 2(台湾)
4 5 ...
3.GroupTable
groupID(PK) groupName
0 所有成员
1 地球
2 台湾
3 台中市
4
3.group-groupTable
upGroupID(FK) downGroupID(FK)
1(地球) 2(台湾)
2 3(台中市)
群组阶层关系
4.group-PersonTable
groupID(FK) personID(FK)
0 ....
0 ....
0 ....
0
3(台中) 1(王小明)
2(台湾) 2(张小婴)
这边比较麻烦要把所有人和Group 0接上
5.PersonTable
personID(PK) name
1 王小明
2 张小婴
正规化之後应该就会生成这麽多表格,只要不是百万级单位,用JOIN捞起来还是很快。
只有阶层那边可能会需要取出後再去做整理,去掉重复的东西。
我记得La大,应该是用JSP开发的,
用JAVA写,应该避免解析字串这种事情。捞代码回来,跑回圈整理应该比较理想。
: TableA
: taid AllowList AllowMember
: 1 ,0,
: 2 ,1,3,4,
: 3
: 4 ,2,5,
: 5
: 6
: .
: .
: 其中 TableA,AllowList 中的数字是指 TableB.tbid
: TableB
: tbid id name case group
: 1 地球 1 0
: 2 台湾 1 1 ← case=1 代表是分类类别
: group 是上层的tbid
: 3 台中市 1 2 ← group = 2,所以是台湾的子类别
: 4 qw8221 王小明 2 3 ← case=2 是成员,所以王小明是台中人(3)
: 而,台中市又在台湾下,所以也是台湾人
: 5 abc01 张小婴 2 2 ← case=2 是成员,所以张小婴是台湾人(2)
: .
: .
: .
: id是唯一值,不会重覆
: 这种阶层关系可以无限制的拓展下去
: 任务内容是要从 TableA.AllowList 找清单,去TableB查表
: 找出所有成员(成员的case为2)的TableB.id
: 整理成 ,id1,id2,id3, 的字串格式 (只有成员,如果是群组,就去找群组下的成员ID)
: 写入 TableA.AllowMember 当中
: 而 AllowList 的数字,可能是一个群组,或是成员
: 而且,当AllowList中的值为空字串时,AllowMember的值也必须是空字串
: 以及,当AllowList中的值是0时,AllowMember中的值则为 EVERYONE 字串
: (允许所有人)
: ====================================================
: 想请问,这可以用纯SQL语法做到吧?
: 我原本想只靠SQL语法解决,可是我发现一堆东西都不会
: 完全没有SQL的sense.....
: 想下手也不知道怎麽下手
: 我知道要捞出 AllowList 怎麽捞
: 可是不知道要怎麽从 AllowList 捞出东西来後
: 再把 AllowList 拆开成 tbid ,再从拆开的 tbid 去查询 id 组成字串写回去
: (如果是群组,还要去找群组中的成员)
: 最後,我是靠程式用递回解决交差
: 但是,还是会想想知道,到底要怎麽用纯 SQL 写出这种功能
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 219.70.17.6
1F:→ LaPass:我也觉得应该正规化.... 只是,我没办法去改资料库结构.... 02/05 13:56
2F:推 hukhuk:table_A 需要正规化吧 02/07 12:24