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.   

    1,分类表id,
    name
    parentsID
    数据如:
    1,中国,0
    2,江苏,1
    3,北京,1
    4,苏州,2
    5,苏大,4
    ......2,学生表
    id,
    name
    classid
    数据如:
    1,小明,5
    ......
      

  2.   

    问题2
    表1,classTable
    ID,ClassName
    如:1,A类
        2,B类
        ....表2,ColOfClass 类中字段
    ID,ClassID,ColName
    如:
    1,1,压力
    2,1,温度
    3,1,重量
    4,2,体积
    4,2,重量
    .......
      

  3.   

    如果按属性建表的话,会很多,我上面举的学生只是个例子
    我的意思,一个事务A的所属类别,这个属性会有很多级,这些级可能会增加,或者会减少,是可以维护的,如果按属性建表只有以后改变数据结构才能维护。
    比如,设备属于 电动设备  ---电机----直流电机
    这只是设备的一个属性 只是分了三个级别 所以不能把拆分成三个属性。而且,这三个级别用户可以自己维护,而且用户会经常按照任一级别的属性来统计查询,所以可以编号设计,比如1 ---电动设备  11----电机 1101--直流电机  设备的属性,设备种类应该是1101 但在查询统计的时候要解析字段,数据量大了以后,会影响性能。递归设计的方法,也会影响DBMS的性能,不知道有没有合理的方法
      

  4.   

    TO:collbull() 请仔细看一下我的表结构,我看是完全能够满足你的要求的,好好理解一下。
      

  5.   

    to : CrazyFor(Fan) 
      我现在就是不知道哪种好,
      分类很深,在查询和统计某一类的时候,是不是要用递归的方法呢,
      还有,会设计分类的参数,比如第5级(最底层)的分类是X  X的参数,有压力,重量 体积等参数,  在设备ID  的记录中就有分类属性  X
    再和子表关联  子表中的为,  ID 参数ID  参数值  
    记录就是为:  设备1   参数2  66.00 
                  设备2   参数3  55.98
    如果想把  某一类比如 X类的设备全部信息显示出来 则要:先在设备表(主表)中查找到 字段“设备分类属性” 为X 的所有设备ID,再到从表设备参数表中查找 刚才查到的设备ID的所有参数(压力,温度等)查找参数id和参数值,(同时跟参数类别表同查显示参数名称),再把对应查找到的记录,中的参数名称(压力,温度等)放到显示设备信息中表头,(也就是记录作为字段来使用)这样又要写存储过程创建临时表,  设备表和参数表的记录都比较多,可能性能上会有影响,上面还只是 同一类的,也就是最底层的类。
    如果不是最底层的,就还要查找他的子类,同样重复上面的工作,
    也就是说涉及到了最少四张表的连查,还要递归查找,创建临时表,等,
    这样建立模型,编程复杂,性能上可能不会很高,
    如果我建几十张表,对每类设备,只要查两张表, 不用建立临时表,而且还很快,限制条件是,每类设备的参数不能更改,这在现实中也能通过。
    不知道哪种好,请大家讨论,请 CrazyFor(Fan)给出比较好的方案。
      

  6.   

    我想这是比较灵活的设计,
    只是在查找子类的时候是比较复杂的,需要使用递归,但是一般情况下,很少会在查询的时候需要包括其子类的,同一级类的查询会比较多一点,而且即使用递归,也不比你用select id from where id like '110101%'会慢多少,但是这样的方法在ID的维护上比较烦。
    不过这种东西也要看个人的编程爱好来做,每个人都比较习惯自己的方法。:)
      

  7.   

    to  CrazyFor(Fan) 但是报表的时候要把类别全部按照层次的格式显示出来,
    不知道你的方法是怎么实现的呢,谢谢
    比如  :
    报表格式如下:
     设备
     动力设备
     一般电动设备
     电动机
     电动机A类
     01 直流电动机  66.00  55.98
    以上是报表的格式,要把层次关系都要显示出来。
    上面都是父类,最地层才是记录,是用户的报表格式
    请大家讨论,怎么样来实现比较合理
      

  8.   

    向上走方便一些,
    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)
      

  9.   

    T0:collbull() 
    现在有个办法就是可以从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