A1:
1.建立级别表,
CREATE TABLE tGRADEDEFINE(
nvGRADENAME NVARCHAR(20),
vGRADECODE VARCHER(48),
iGRADELEVEL INT)
example: 中国,0000,1
河北省,0001,2
上海市,0002,2
北京大学,0001,3
2.建立学生表.
create table tSTUDENT(
nvSname nvarcher(10),
vStype varchar(48)
.....)
EXAMPLE:TEST,000000010001,....
没有仔细写,只是给你一个提示,你能明白我的意思么?
1.建立级别表,
CREATE TABLE tGRADEDEFINE(
nvGRADENAME NVARCHAR(20),
vGRADECODE VARCHER(48),
iGRADELEVEL INT)
example: 中国,0000,1
河北省,0001,2
上海市,0002,2
北京大学,0001,3
2.建立学生表.
create table tSTUDENT(
nvSname nvarcher(10),
vStype varchar(48)
.....)
EXAMPLE:TEST,000000010001,....
没有仔细写,只是给你一个提示,你能明白我的意思么?
name
parentsID
数据如:
1,中国,0
2,江苏,1
3,北京,1
4,苏州,2
5,苏大,4
......2,学生表
id,
name
classid
数据如:
1,小明,5
......
表1,classTable
ID,ClassName
如:1,A类
2,B类
....表2,ColOfClass 类中字段
ID,ClassID,ColName
如:
1,1,压力
2,1,温度
3,1,重量
4,2,体积
4,2,重量
.......
我的意思,一个事务A的所属类别,这个属性会有很多级,这些级可能会增加,或者会减少,是可以维护的,如果按属性建表只有以后改变数据结构才能维护。
比如,设备属于 电动设备 ---电机----直流电机
这只是设备的一个属性 只是分了三个级别 所以不能把拆分成三个属性。而且,这三个级别用户可以自己维护,而且用户会经常按照任一级别的属性来统计查询,所以可以编号设计,比如1 ---电动设备 11----电机 1101--直流电机 设备的属性,设备种类应该是1101 但在查询统计的时候要解析字段,数据量大了以后,会影响性能。递归设计的方法,也会影响DBMS的性能,不知道有没有合理的方法
我现在就是不知道哪种好,
分类很深,在查询和统计某一类的时候,是不是要用递归的方法呢,
还有,会设计分类的参数,比如第5级(最底层)的分类是X X的参数,有压力,重量 体积等参数, 在设备ID 的记录中就有分类属性 X
再和子表关联 子表中的为, ID 参数ID 参数值
记录就是为: 设备1 参数2 66.00
设备2 参数3 55.98
如果想把 某一类比如 X类的设备全部信息显示出来 则要:先在设备表(主表)中查找到 字段“设备分类属性” 为X 的所有设备ID,再到从表设备参数表中查找 刚才查到的设备ID的所有参数(压力,温度等)查找参数id和参数值,(同时跟参数类别表同查显示参数名称),再把对应查找到的记录,中的参数名称(压力,温度等)放到显示设备信息中表头,(也就是记录作为字段来使用)这样又要写存储过程创建临时表, 设备表和参数表的记录都比较多,可能性能上会有影响,上面还只是 同一类的,也就是最底层的类。
如果不是最底层的,就还要查找他的子类,同样重复上面的工作,
也就是说涉及到了最少四张表的连查,还要递归查找,创建临时表,等,
这样建立模型,编程复杂,性能上可能不会很高,
如果我建几十张表,对每类设备,只要查两张表, 不用建立临时表,而且还很快,限制条件是,每类设备的参数不能更改,这在现实中也能通过。
不知道哪种好,请大家讨论,请 CrazyFor(Fan)给出比较好的方案。
只是在查找子类的时候是比较复杂的,需要使用递归,但是一般情况下,很少会在查询的时候需要包括其子类的,同一级类的查询会比较多一点,而且即使用递归,也不比你用select id from where id like '110101%'会慢多少,但是这样的方法在ID的维护上比较烦。
不过这种东西也要看个人的编程爱好来做,每个人都比较习惯自己的方法。:)
不知道你的方法是怎么实现的呢,谢谢
比如 :
报表格式如下:
设备
动力设备
一般电动设备
电动机
电动机A类
01 直流电动机 66.00 55.98
以上是报表的格式,要把层次关系都要显示出来。
上面都是父类,最地层才是记录,是用户的报表格式
请大家讨论,怎么样来实现比较合理
Declare @inputID int ---电动机A类ID
declare @NameString varchar(8000),@Cur_id, int ,@Cur_name varchar(100),@Cur_parentsID intselect @NameString = ''
DECLARE ShowClassName CURSOR local FOR
SELECT id,name,parentsID where ID=@InputID
OPEN ShowClassName
FETCH NEXT FROM ShowClassName
INTO @Cur_id,@Cur_name,@Cur_parentsID
WHILE @@FETCH_STATUS = 0
BEGIN
select @InputID=@Cur_parentsID
select @NameString ='->'+ @Cur_Name+@NameString FETCH NEXT FROM ShowClassName
INTO @Cur_id,@Cur_name,@Cur_parentsID
EndCLOSE ShowClassName
DEALLOCATE ShowClassName
select @NameString =right(@NameString ,len(@NameString)-2)
现在有个办法就是可以从ID,fatherID的这种方法向'000010001'这种方法的转换,类似下面,相信这样你还是觉得不方便就可以用下面代码来保存两种保存class的方法了。drop table #temp
select id,fatherid,name,cast('' as varchar(8000)) as OrderCol into #temp from temp$declare @I int,@J int
select @I=1
select @j=(select max(id) from #temp)
while @I<=@j
begin
update #temp
set OrderCol=
isnull((select OrderCol from #temp as cc where id=#temp.FatherId),'')+
right('0000'+cast(#temp.fatherid as varchar),4)
+right('0000'+cast(#temp.id as varchar),4)
where #temp.id=@I
select @i=@I+1
end
select * from #temp order by OrderCol