| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1553 人关注过本帖
标题:实践:关系数据库的规范化
取消只看楼主 加入收藏
lyxc34
Rank: 2
等 级:论坛游民
帖 子:139
专家分:50
注 册:2011-7-3
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:13 
实践:关系数据库的规范化
  现有如下表:
  
图片附件: 游客没有浏览图片的权限,请 登录注册

  字段分别是学号、姓名、各科目代码,然后数据都是各科成绩,这只是一个专业一个学期的成绩表,一共4个学期,28个专业,100个科目,112个这样的表,现在需要将成绩信息建库。
  目前我的想法是把所有学生成绩全做成一个表,5个字段:学号,年级,学期,科目代码,成绩,这样查询起来会比较方便,不过记录数会达到 学生总人数*科目  约50万条.如果以这个表为源表进行数据库的规范,思路是什么样的。谢谢!

[ 本帖最后由 lyxc34 于 2011-7-9 15:44 编辑 ]
搜索更多相关主题的帖子: 各科成绩 学生成绩 数据库 成绩表 姓名 
2011-07-09 15:35
lyxc34
Rank: 2
等 级:论坛游民
帖 子:139
专家分:50
注 册:2011-7-3
收藏
得分:0 
 我现在定下来的有学生表、专业表、课程表、班级表,字段和你说的差不多,主索引分别是xh,zydm,kch,bjmc.
  现在的问题就是成绩表不好定,年级和学期是小事,有和没有关系不大,看有没什么好的方法。学生与课程是一对多,学生与成绩也是一对多,成绩和课程还有联系,所以不知道怎么再投影分解了,不分解的话那记录数真有点多,学校的机子都是老爷机,还有内存256的,怕直接挂掉。
2011-07-09 16:30
lyxc34
Rank: 2
等 级:论坛游民
帖 子:139
专家分:50
注 册:2011-7-3
收藏
得分:0 
嗯。用表达式联合索引,这个懂了。对于这个表的数据冗余没有办法对吧
2011-07-09 16:45
lyxc34
Rank: 2
等 级:论坛游民
帖 子:139
专家分:50
注 册:2011-7-3
收藏
得分:0 
哦,这样解释就完全明白了,哈哈。3Q
再一个问题,我要由交叉表(EXCEL格式)还原到VFP的2元表,也就是由
学号  语文 数学       学号  课程  成绩
1   80  90     1       语文     80
2   70  50        1       数学   90
3   60  75          2       语文     70
                         2       数学     50
                         3    语文    60
                         3       数学   75
  为这个问题我从昨天中午一直弄到现在,最后的结果是利用程序:
程序代码:
SELECT C06,C01,C03,C07,C04,C05,C02,C09,C08,C51,C52 FROM cjb20.dbf INTO ARRAY TEMP 

R=272  &&代表行数
C=11  &&代表列数

LOCAL NewTemp(R*C)
i=1
j=1  
FOR n=1 TO R*C
  IF i<=R
    IF j<=C
    NewTemp(n)=Temp(i,j)
    ELSE
    i=i+1
    j=1
    NewTemp(n)=Temp(i,j)
    ENDIF
    j=j+1
  ENDIF
ENDFOR

USE h:\VFP\DATA\TABLES\cjk.dbf
SELECT cjk
FOR k=1 TO R*C
  GO BOTTOM
  APPEND BLANK
  REPLACE cj WITH NewTemp(k)
  IF EOF()
    EXIT
  ENDIF
  SKIP
ENDFOR

BROWSE

  先将所有的成绩排成一列,然后再用一个类似程序将学号和课程排成一列,方法很笨,效率也不高,不知道有没有好的方法?

[ 本帖最后由 lyxc34 于 2011-7-9 17:08 编辑 ]
2011-07-09 17:02
lyxc34
Rank: 2
等 级:论坛游民
帖 子:139
专家分:50
注 册:2011-7-3
收藏
得分:0 
哈哈,我就是想偷个懒,因为如果要这样的话一共128张表要我手动的来导入,改格式,总想用一劳永逸的方法。
2011-07-09 17:38
lyxc34
Rank: 2
等 级:论坛游民
帖 子:139
专家分:50
注 册:2011-7-3
收藏
得分:0 
嗯。对于自定义函数和过程,以及表单里面的新建属性和方法,我都不熟,所以很少想到用这个方法,现在记住了,我再去看看资料。
2011-07-09 18:37
lyxc34
Rank: 2
等 级:论坛游民
帖 子:139
专家分:50
注 册:2011-7-3
收藏
得分:0 
回复 12楼 TonyDeng
  感觉我要达到你说的这水平,需要很长的时间,我现在连自定义函数和过程都不熟,毕竟没有系统的学过理论。现在的短期目标只是把手上的学生信息管理系统做出来,争取开学就能用。现在是越做问题越多,关是如何建表和导入数据大概就花了近一个星期,改了好几次。
  晚上用了三个多小时的时间,把前面说的数据格式重排程序整合成了一个程序,里面定义了三个过程,代码如下,请指教!
程序代码:
R=272
C=11
SELECT C06,C01,C03,C07,C04,C05,C02,C09,C08,C51,C52 FROM cjb20.dbf INTO ARRAY ARRA1
SELECT xh FROM cjb20.dbf INTO ARRAY ARRA2
DIMENSION ARRA3(C)
ARRA3(1)="C06"
ARRA3(2)="C01"
ARRA3(3)="C03"
ARRA3(4)="C07"
ARRA3(5)="C04"
ARRA3(6)="C05"
ARRA3(7)="C02"
ARRA3(8)="C09"
ARRA3(9)="C08"
ARRA3(10)="C51"
ARRA3(11)="C52"

DO Cj WITH R,C,ARRA1
DO XH WITH R,C,ARRA2
DO KC WITH R,C,ARRA3


PROCEDURE CJ
  LPARAMETERS Row,Colu,Arra
  LOCAL NewArra(Row*Colu)
i=1
j=1
FOR n=1 TO Row*Colu
  IF i<=Row
    IF j<=Colu
    NewArra(n)=Arra(i,j)
    ELSE
    i=i+1
    j=1
    NewArra(n)=Arra(i,j)
    ENDIF
    j=j+1
  ENDIF
ENDFOR

USE data\tables\cjk.dbf
SELECT cjk
FOR k=1 TO Row*Colu
  GO BOTTOM
  APPEND BLANK
  REPLACE cj WITH NewArra(k)
  IF EOF()
    EXIT
  ENDIF
  SKIP
ENDFOR

RETURN
ENDPROC


PROCEDURE XH
  LPARAMETERS Row,Colu,Arra
a=RECCOUNT()-Row*Colu
USE h:\vfp\data\tables\cjk.dbf
SELECT cjk
GO a+1
FOR k=1 TO Row
  FOR n=1 TO Colu
  REPLACE xh WITH Arra(k)
  IF EOF()
  EXIT
  ENDIF
  SKIP
  ENDFOR
ENDFOR

RETURN
ENDPROC


PROCEDURE KC
  LPARAMETERS Row,Colu,Arra
a=RECCOUNT()-Row*Colu
USE h:\vfp\data\tables\cjk.dbf
SELECT cjk
GO a+1
FOR k=1 TO Row
  FOR n=1 TO Colu
    REPLACE kch WITH Arra(n)
    IF EOF()
      EXIT
    ENDIF
    SKIP
  ENDFOR
ENDFOR

RETURN
ENDPROC

  需要接受的变量就是R、A和数组ARR,这三个需要根据不同的表手动去改,如果不是因为ARR需要用SELECT语句传递数据,应该就可以做成一个方法,然后在表单里面去引用,实现格式的自动转化。这个思路是否能实现?    如果能实现的话这是不是就是你说的“黑箱”,也就是类?

[ 本帖最后由 lyxc34 于 2011-7-9 23:29 编辑 ]
2011-07-09 23:10
lyxc34
Rank: 2
等 级:论坛游民
帖 子:139
专家分:50
注 册:2011-7-3
收藏
得分:0 
  对哦,我忘记R和C只要有表就可以用函数来获取,那最后就只有2个变量了。我今天才在别人的讨论中才知道有Afield()这个函数,以前一直不知道怎么引用字段名,用这个函数就可以解决R和C值的获取。
  字符串传送SELECT语句这倒是第一回听说,没想过这个用法,不大懂,个人理解难道是直接将整个语句当字母组合而不是值通过S传递给自定义函数(过程)?
  宏一直没太理解这个概念,第一次接触和用宏是在玩魔兽世界的时候里面做技能宏,现在的理解感觉宏就和按键精灵一样,记录下一串需要不停重复的连续动作,然后每次以这一“串”动作为单位来执行,不知道这个理解对不对。还有类这个概念也很模糊。
  再就是三个函数合并的实现,因为学号、课程号和成绩通过数组传递后排序的方式不一样,如果一个函数搞定的话需要考虑的太多了,分解来做的话每个函数的数据逻辑比较简单点,光是这个简单的就花了我老半天,我现在的水平还只能停留在循环套循环和循环套条件上面,再麻烦点我怕我脑子不够用。不怕你见笑,上面这几个循环我测试了快2天才测试成功,这几天满脑子都是这些变量在跳。
  做这个系统其实没什么利益可言的,只是看教务科的同事每个学期都花大量的时间来做一些无脑的数据处理工作,查一个学生的成绩,得打开无数层文件夹,然后在N个EXCEL表里面去找,经常连他自己都找不到在哪儿,而期末考试安排,成绩录入,成绩单打印这些更是花时间,太没效率了,希望做个系统能有所改进。也借这个机会来学习学习,毕竟个人对这一部分比较感兴趣。

[ 本帖最后由 lyxc34 于 2011-7-10 00:20 编辑 ]
2011-07-10 00:18
lyxc34
Rank: 2
等 级:论坛游民
帖 子:139
专家分:50
注 册:2011-7-3
收藏
得分:0 
在哪个论坛?这个论坛好像没有找到啊。
还有今天又碰到个问题,我定义数组,然后给数组赋值,用了个循环:
程序代码:
USE cjb.dbf
C=RECCOUNT()
DIMENSION ARRA(C)
FOR n=1 TO C
ARRA(n)=FIELD(n)
ENDFOR

结果提示“找不到变量”,出错在ARR3(n)=FIELD(n),FIELD(n)我用?显示是正常的,说明错误在ARRA(n),难道是数组下标不能用变量?我在帮助文件里面也没有找到相应的解释。
2011-07-10 20:23
lyxc34
Rank: 2
等 级:论坛游民
帖 子:139
专家分:50
注 册:2011-7-3
收藏
得分:0 
那直接改成FOR n=1 TO FCOUNT()就OK了。
我就说应该不会不能用变量,我定义数组的时候也用的变量。
发现编程序的时候,一个小小的失误就得整好长的时间。
2011-07-10 20:45
快速回复:实践:关系数据库的规范化
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020335 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved