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

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

[ 本帖最后由 lyxc34 于 2011-7-9 15:44 编辑 ]
搜索更多相关主题的帖子: 各科成绩 学生成绩 数据库 成绩表 姓名 
2011-07-09 15:35
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:10 
全一個表當然不規範了。按邏輯分類,業務是熟悉的,這不成問題,我看你之前的數據庫都分開了。

學號、姓名、性別之類,屬於學生個體信息,是一體的,它們應該放在一起,這是一個獨立的表。
學校開設的系、專業,是學校的固定信息,也應該是獨立表,記錄系代碼、專業代碼、課程代碼。
老師姓名、任課之類,是老師的信息,獨立表,記錄系代碼、專業代碼、課程代碼。
課程數據庫,名稱、課程代碼。
成績表,記錄學生學號、課程代碼,有學號就有考試時間。
以班爲基本單元,記錄學號(據此得到姓名、性別、入學時間等信息)、系代碼、專業代碼。全校學生都在這一張表上,學號與第幾屆結合是唯一主關鍵字。

大致是這樣考慮吧,再具體的應看你校情況和實際需要而定。

授人以渔,不授人以鱼。
2011-07-09 16:16
lyxc34
Rank: 2
等 级:论坛游民
帖 子:139
专家分:50
注 册:2011-7-3
收藏
得分:0 
 我现在定下来的有学生表、专业表、课程表、班级表,字段和你说的差不多,主索引分别是xh,zydm,kch,bjmc.
  现在的问题就是成绩表不好定,年级和学期是小事,有和没有关系不大,看有没什么好的方法。学生与课程是一对多,学生与成绩也是一对多,成绩和课程还有联系,所以不知道怎么再投影分解了,不分解的话那记录数真有点多,学校的机子都是老爷机,还有内存256的,怕直接挂掉。
2011-07-09 16:30
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:2 
要單獨開成績表。學號和課程是可以重複的,但學號加課程是唯一的。你可能被主索引的唯一性嚇到了,以為數據庫表不能有重複編號的記錄。

這個表應有三個索引:學號、課程、學號+課程。現在知道怎麽用了吧?

[ 本帖最后由 TonyDeng 于 2011-7-9 16:40 编辑 ]

授人以渔,不授人以鱼。
2011-07-09 16:33
lyxc34
Rank: 2
等 级:论坛游民
帖 子:139
专家分:50
注 册:2011-7-3
收藏
得分:0 
嗯。用表达式联合索引,这个懂了。对于这个表的数据冗余没有办法对吧
2011-07-09 16:45
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:4 
這個不叫數據冗餘,是必須的。冗餘是指多餘的、不起作用的,而這個才是關鍵性的。等於日期,年-月-日,拆開都是重複數據,但合在一起是唯一(某些時候,只考慮年月,不考慮日,就要這樣編製數據結構,把年、月分開爲兩個字段)。事實上,多級編碼都是這類思維,如身份證號碼,就是多個字段信息合成的,拆開了全是重複性數據。

[ 本帖最后由 TonyDeng 于 2011-7-9 16:52 编辑 ]

授人以渔,不授人以鱼。
2011-07-09 16:48
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
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:4 
這個方法可以了,在效率和正確性之間,正確性是第一位的。寫程序,無非是正確性、可維護性、效率的優化,其重要性依次排列。除了實時環境,比如工業控制、即時通訊等場合,不必過分追求效率,須知計算機做兩三分鐘的事,人做要兩三個小時,已經是非常高的效率了。使用計算機的效率是從這個方面看的。以前初用dBASE的年代,寫個工資發放程序,要運行一個晚上,幾十張360K的軟盤插來插去,自覺很慢,但財務領導一句話令我恍然大悟:“我們以前人手做,要一個星期,現在已經提高很大的效率了。”這話後來在做各種應用程序時,都不時體驗出來。確實,計算機就是這樣用的。

授人以渔,不授人以鱼。
2011-07-09 17:24
lyxc34
Rank: 2
等 级:论坛游民
帖 子:139
专家分:50
注 册:2011-7-3
收藏
得分:0 
哈哈,我就是想偷个懒,因为如果要这样的话一共128张表要我手动的来导入,改格式,总想用一劳永逸的方法。
2011-07-09 17:38
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
把這個過程編成帶參數的函數(代碼可重用性思維是必須有的),然後把128張表的文件名寫在一個數據表中(數組也可以),讓程序自己做去。

[ 本帖最后由 TonyDeng 于 2011-7-9 17:50 编辑 ]

授人以渔,不授人以鱼。
2011-07-09 17:41
快速回复:实践:关系数据库的规范化
数据加载中...
 
   



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

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