热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

教务系统数据库设计(一)

从11月中旬以来一直在做教务系统,开始阶段是各个子系统独立开发,包括评教系统、选修课系统、考试系统三个子系统,这三个系统已经有原型

        从11月中旬以来一直在做教务系统,开始阶段是各个子系统独立开发,包括评教系统、选修课系统、考试系统三个子系统,这三个系统已经有原型,我们采用的都是原型开发,因为需求已经确定,研究了一段时间把用例图、类图等画了画,完成了大部分了,快该写代码了然后,老师说需要把这三个系统整合在一起,做一个教务系统,教务系统是一个平台,可以往里面扩充子系统,使得信息可以共享,避免信息孤岛的出现。

 

        对于想要建立共享性、集成性高的系统即要设计一个结构紧密又灵活性好的共享数据库,下面一段很长的时间就是设计教务系统的数据库……

       下面是我们数据库设计的过程中遇到的一些问题

 

       1. 数据库表之间该不该多用主外键呢 ?

            先说我们做的评教系统,单独从这一个系统角度考虑,建立我们自己的数据库表,我们多加一些主键无所谓,加多点主键还可以使得表结构严谨,数据一致性好,但是当我们再加入新的系统的时候,把选课系统也加入到这个系统中,那么评教系统中的表就需要从新设计里面的主外键,出现这样的情况是当初设计表结构时没有考虑到灵活性,单独从一个系统角度考虑,即过多使用主外键也会使得表结构过于紧密、灵活性差,在什么情况下使用还需多多考虑。

 

            那主外键就不使用了吗?当然不是,既然主外键可以使得表一致性高、扩展性差,那我们可以避开缺点,使用优点,在需要扩展的地方尽量不使用主外键关系,而在要求扩展性不高的地使用主键外键,根据这一原则更改表结构

           更改后的数据库设计,如下

          

           新增了中间表(关系表)充当主外键的作用维持数据一致性,把基础表中的键关系移动到了基础表与关系表中,这看上去好像是降低了基础表与基础表之间的耦合度,给基础表解耦,这让我想起了中介者模式,通过一个中介类来给各个对象解耦,通过中介通信,而不是让各个类直接通信,举个例子:各个国家中国、美国、日本等有时并不直接交涉而不是通过联合国,给各个国家之间解耦,不管是在生活、学习中,设计模式的思想无处不在,值得学习。

          

       2.  基础表与子系统表如何划分 ?

          从每一个子系统方面考虑,子系统表无论放基础里还是放自己系统里都可以实现,其区别是放基础里面别的子系统可以使用,来共享信息,分表的时候按着信息是否需要共享来分表,如果这种信息不需要共享,那我们就没有必要往基础表里面放,如果放在基础表里面反而会增加基础表负担,增加数据库表冗余。

 

          举个例子:例如TB_Student、TB_Teacher、TB_College、TB_Department等表,只要是学校里的系统,一般都会用到这些信息,很显然,这些表应该归为基础表,另外还有一些特殊关系表也应该规则基础表,如老师课程关系表等,这也是基础信息,这些信息不依附于某个子系统。

         

          其中,也还有很多细节问题,不一一列举,下面是数据库设计一点点经验

 

          我们设计数据库时可以遵循这样的设计原则:

 

          (1) 数据库中表的个数越少越好。

                   形成了对客观世界的高度抽象,进行了系统的数据集成,防止了打补丁式的设计

          (2) 表中组合主键的字段个数越少越好。

                  因为主键的作用,一是建主键索引,二是做为子表的外键,所以组合主键的字段个数少了,不仅节省了运行时间,而且节省了索引存储空间;

          (3) 表中的字段个数越少越好。

                  减少数据冗余,一种方法是“列变行”,所谓“列变行”,就是将主表中的一部分内容拉出去,另外单独建一个子表。这样就防止了将子表中的字段拉入到主表中去,在主表中留下许多空余的字段。

 

          (4) 降低范式,增加冗余, 少用触发器, 多用存储过程。

          (5) 当计算非常复杂、而且记录条数非常巨大时,复杂计算要先在数据库外面。

 

          (6) 发现某个表的记录太多,例如超过一千万条,则要对该表进行水平分割。水平分割的做法是,以该表主键PK的某个值为界线,将该表的记录水平分割为两个表。若发现某个表的字段太多,例如超过八十个,则垂直分割该表,将原来的一个表分解为两个表。

          (7) 对数据库管理系统DBMS进行系统优化,即优化各种系统参数,如缓冲区个数。

 

 


转:https://www.cnblogs.com/lilongsheng/archive/2012/12/31/3226070.html



推荐阅读
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 使用Python在SAE上开发新浪微博应用的初步探索
    最近重新审视了新浪云平台(SAE)提供的服务,发现其已支持Python开发。本文将详细介绍如何利用Django框架构建一个简单的新浪微博应用,并分享开发过程中的关键步骤。 ... [详细]
  • 本文详细介绍了美国最具影响力的十大财团,包括洛克菲勒、摩根、花旗银行等。这些财团在历史发展过程中逐渐形成,并对美国的经济、政治和社会产生深远影响。 ... [详细]
  • Hadoop入门与核心组件详解
    本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ... [详细]
  • QUIC协议:快速UDP互联网连接
    QUIC(Quick UDP Internet Connections)是谷歌开发的一种旨在提高网络性能和安全性的传输层协议。它基于UDP,并结合了TLS级别的安全性,提供了更高效、更可靠的互联网通信方式。 ... [详细]
  • 构建基于BERT的中文NL2SQL模型:一个简明的基准
    本文探讨了将自然语言转换为SQL语句(NL2SQL)的任务,这是人工智能领域中一项非常实用的研究方向。文章介绍了笔者在公司举办的首届中文NL2SQL挑战赛中的实践,该比赛提供了金融和通用领域的表格数据,并标注了对应的自然语言与SQL语句对,旨在训练准确的NL2SQL模型。 ... [详细]
  • 尽管某些细分市场如WAN优化表现不佳,但全球运营商路由器和交换机市场持续增长。根据最新研究,该市场预计在2023年达到202亿美元的规模。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文详细介绍了如何使用ActionScript 3.0 (AS3) 连接并操作MySQL数据库。通过具体的代码示例和步骤说明,帮助开发者理解并实现这一过程。 ... [详细]
  • 在即将迎来26岁生日之际,作者的人生陷入了低谷。经过近三年的硕士学习后,最终决定退学,并且面临没有工作经验的困境。尽管如此,作者依然坚定地选择为自己的人生负责。 ... [详细]
  • andr ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
author-avatar
小于2502919693
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有