【数据库优化汇总】使用这8招后,数据库查询从191s优化到30ms!

为什么数据库会慢?

慢的本质


 

查找的时间复杂度

查找算法

存储数据结构

存储数据结构

数据总量

数据拆分

高负载

CPU、磁盘繁忙

无论是关系型数据库还是NoSQL,任何存储系统决定于其查询性能的主要有三种:

  • 查找的时间复杂度
  • 数据总量
  • 高负载

而决定于查找时间复杂度主要有两个因素:

  • 查找算法
  • 存储数据结构

无论是哪种存储,数据量越少,自然查询性能就越高,随着数据量增多,资源的消耗(CPU、磁盘读写繁忙)、耗时也会越来越高。

从关系型数据库角度出发,索引结构基本固定是B+Tree,时间复杂度是O(log n),存储结构是行式存储。因此咱们对于关系数据库能优化的一般只有数据量。

而高负载造成原因有高并发请求、复杂查询等,导致CPU、磁盘繁忙等,而服务器资源不足则会导致慢查询等问题。该类型问题一般会选择集群、数据冗余的方式分担压力。

应该站在哪个层面思考优化?

从上图可见,自顶向下的一共有四层,分别是硬件、存储系统、存储结构、具体实现。层与层之间是紧密联系的,每一层的上层是该层的载体;因此越往顶层越能决定性能的上限,同时优化的成本也相对会比较高,性价比也随之越低。以最底层的具体实现为例,那么索引的优化的成本应该是最小的,可以说加了索引后无论是CPU消耗还是响应时间都是立竿见影降低;然而一个简单的语句,无论如何优化加索引也是有局限的,当在具体实现这层没有任何优化空间的时候就得往上一层【存储结构】思考,思考是否从物理表设计的层面出发优化(如分库分表、压缩数据量等),如果是文档型数据库得思考下文档聚合的结果;如果在存储结构这层优化得没效果,得继续往再上一次进行考虑,是否关系型数据库应该不适合用在现在得业务场景?如果要换存储,那么得换怎样得NoSQL?

所以咱们优化的思路,出于性价比的优先考虑具体实现,实在没有优化空间了再往上一层考虑。当然如果公司有钱,直接使用钞能力,绕过了前面三层,这也是一种便捷的应急处理方式。

该篇文章不讨论顶与底的两个层面的优化,主要从存储结构、存储系统中间两层的角度出发进行探讨

八大方案总结

数据库的优化方案核心本质有三种:减少数据量用空间换性能选择合适的存储系统,这也对应了开篇讲解的慢的三个原因:数据总量、高负载、*查找的时间复杂度。*

这里大概解释下收益类型:短期收益,处理成本低,能紧急应对,久了则会有技术债务;长期收益则跟短期收益相反,短期内处理成本高,但是效果能长久使用,扩展性会更好。

静态数据意思是,相对改动频率比较低的,也无需过多联表的,where过滤比较少。动态数据与之相反,更新频率高,通过动态条件筛选过滤。

减少数据量

减少数据量类型共有四种方案:数据序列化存储、数据归档、中间表生成、分库分表。

就如上面所说的,无论是哪种存储,数据量越少,自然查询性能就越高,随着数据量增多,资源的消耗(CPU、磁盘读写繁忙)、耗时也会越来越高。目前市面上的NoSQL基本上都支持分片存储,所以其天然分布式写的能力从数据量上能得到非常的解决方案。而关系型数据库,查找算法与存储结构是可以优化的空间比较少,因此咱们一般思考出发点只有从如何减少数据量的这个角度进行选择优化,因此本类型的优化方案主要针对关系型数据库进行处理。

数据归档

注意点:别一次性迁移数量过多,建议低频率多次限量迁移。像MySQL由于删除数据后是不会释放空间的,可以执行命令OPTIMIZE TABLE释放存储空间,但是会锁表,如果存储空间还满足,可以不执行。

建议优先考虑该方案,主要通过数据库作业把非热点数据迁移到历史表,如果需要查历史数据,可新增业务入口路由到对应的历史表(库)。

中间表(结果表)

中间表(结果表)其实就是利用调度任务把复杂查询的结果跑出来存储到一张额外的物理表,因为这张物理表存放的是通过跑批汇总后的数据,因此可以理解成根据原有的业务进行了高度的数据压缩。以报表为例,如果一个月的源数据有数十万,我们通过调度任务以月的维度生成,那么等于把原有的数据压缩了几十万分之一;接下来的季报和年报可以根据月报*N来进行统计,以这种方式处理的数据,就算三年、五年甚至十年数据量都可以在接受范围之内,而且可以精确计算得到。

那么数据的压缩比率是否越低越好?下面有一段口诀:

  • 字段越多,粒度越细,灵活性越高,可以以中间表进行不同业务联表处理。
  • 字段越少,粒度越粗,灵活性越低,一般作为结果表查询出来。

数据序列化存储

在数据库以序列化存储的方式,对于一些不需要结构化存储的业务来说是一种很好减少数据量的方式,特别是对于一些M*N的数据量的业务场景,如果以M作为主表优化,那么就可以把数据量维持最多是M的量级。另外像订单的地址信息,这种业务一般是不需要根据里面的字段检索出来,也比较适合。

这种方案我认为属于一种临时性的优化方案,无论是从序列化后丢失了部份字段的查询能力,还是这方案的可优化性都是有限的。

分库分表

分库分表作为数据库优化的一种非常经典的优化方案,特别是在以前NoSQL还不是很成熟的年代,这个方案就如救命草一般的存在。

如今也有不少同行也会选择这种优化方式,但是从我角度来看,分库分表是一种优化成本很大的方案。这里我有几个建议:

  1. 分库分表是实在没有办法的办法,应放到最后选择。
  2. 优先选择NoSQL代替,因为NoSQL诞生基本上为了扩展性与高性能。
  3. 究竟分库还是分表?量大则分表,并发高则分库
  4. 不考虑扩容,一部做到位。因为技术更新太快了,每3-5年一大变。

拆分方式

只要涉及到这个拆,那么无论是微服务也好,分库分表也好,拆分的方式主要分两种:垂直拆分、水平拆分

垂直拆分更多是从业务角度进行拆分,主要是为了降低业务耦合度;此外以SQL Server为例,一页是8KB存储,如果在一张表里字段越多,一行数据自然占的空间就越大,那么一页数据所存储的行数就自然越少,那么每次查询所需要IO则越高因此性能自然也越慢;因此反之,减少字段也能很好提高性能。之前我听说某些同行的表有80个字段,几百万的数据就开始慢了。

水平拆分更多是从技术角度进行拆分,拆分后每张表的结构是一模一样的,简而言之就是把原有一张表的数据,通过技术手段进行分片到多张表存储,从根本上解决了数据量的问题。

路由方式

进行水平拆分后,根据分区键(sharding key)原来应该在同一张表的数据拆解写到不同的物理表里,那么查询也得根据分区键进行定位到对应的物理表从而把数据给查询出来。

路由方式一般有三种区间范围、Hash、分片映射表,每种路由方式都有自己的优点和缺点,可以根据对应的业务场景进行选择。

区间范围根据某个元素的区间的进行拆分,以时间为例子,假如有个业务我们希望以月为单位拆分那么表就会拆分像 table_2022-04,这种对于文档型、ElasticSearch这类型的NoSQL也适用,无论是定位查询,还是日后清理维护都是非常的方便的。那么缺点也明显,会因为业务独特性导致数据不平均,甚至不同区间范围之间的数据量差异很大。

Hash也是一种常用的路由方式,根据Hash算法取模以数据量均匀分别存储在物理表里,缺点是对于带分区键的查询依赖特别强,如果不带分区键就无法定位到具体的物理表导致相关所有表都查询一次,而且在分库的情况下对于Join、聚合计算、分页等一些RDBMS的特性功能还无法使用。

一般分区键就一个,假如有时候业务场景得用不是分区键的字段进行查询,那么难道就必须得全部扫描一遍?其实可以使用分片映射表的方式,简单来说就是额外有一张表记录额外字段与分区键的映射关系。举个例子,有张订单表,原本是以UserID作为分区键拆分的,现在希望用OrderID进行查询,那么得有额外得一张物理表记录了OrderID与UserID的映射关系。因此得先查询一次映射表拿到分区键,再根据分区键的值路由到对应的物理表查询出来。可能有些朋友会问,那这映射表是否多一个映射关系就多一张表,还是多个映射关系在同一张表。我优先建议单独处理,如果说映射表字段过多,那跟不进行水平拆分时的状态其实就是一致的,这又跑回去的老问题。

用空间换性能

该类型的两个方案都是用来应对高负载的场景,方案有以下两种:分布式缓存、一主多从。

与其说这个方案叫用空间换性能,我认为用空间换资源更加贴切一些。因此两个方案的本质主要通数据冗余、集群等方式分担负载压力。

对于关系型数据库而言,因为他的ACID特性让它天生不支持写的分布式存储,但是它依然天然的支持分布式读

分布式缓存

缓存层级可以分好几种:客户端缓存API服务本地缓存分布式缓存,咱们这次只聊分布式缓存。一般我们选择分布式缓存系统都会优先选择NoSQL的键值型数据库,例如Memcached、Redis,如今Redis的数据结构多样性,高性能,易扩展性也逐渐占据了分布式缓存的主导地位。

缓存策略也主要有很多种:Cache-AsideRead/Wirte-ThroughWrite-Back,咱们用得比较多的方式主要Cache-Aside,具体流程可看下图:

我相信大家对分布式缓存相对都比较熟悉了,但是我在这里还是有几个注意点希望提醒一下大家:

避免滥用缓存

缓存应该是按需使用,从28法则来看,80%的性能问题由主要的20%的功能引起。滥用缓存的后果会导致维护成本增大,而且有一些数据一致性的问题也不好定位。特别像一些动态条件的查询或者分页,key的组装是多样化的,量大又不好用keys指令去处理,当然我们可以用额外的一个key把记录数据的key以集合方式存储,删除时候做两次查询,先查Key的集合,然后再遍历Key集合把对应的内容删除。这一顿操作下来无疑是非常废功夫的,谁弄谁知道。

避免缓存击穿

当缓存没有数据,就得跑去数据库查询出来,这就是缓存穿透。假如某个时间临界点数据是空的例如周排行榜,穿透过去的无论查找多少次数据库仍然是空,而且该查询消耗CPU相对比较高,并发一进来因为缺少了缓存层的对高并发的应对,这个时候就会因为并发导致数据库资源消耗过高,这就是缓存击穿。数据库资源消耗过高就会导致其他查询超时等问题。

该问题的解决方案也简单,对于查询到数据库的空结果也缓存起来,但是给一个相对快过期的时间。有些同行可能又会问,这样不就会造成了数据不一致了么?一般有数据同步的方案像分布式缓存、后续会说的一主多从、CQRS,只要存在数据同步这几个字,那就意味着会存在数据一致性的问题,因此如果使用上述方案,对应的业务场景应允许容忍一定的数据不一致。

不是所有慢查询都适用

一般来说,慢的查询都意味着比较吃资源的(CPU、磁盘I/O)。举个例子,假如某个查询功能需要3秒时间,串行查询的时候并没什么问题,我们继续假设这功能每秒大概QPS为100,那么在第一次查询结果返回之前,接下来的所有查询都应该穿透到数据库,也就意味着这几秒时间有300个请求到数据库,如果这个时候数据库CPU达到了100%,那么接下来的所有查询都会超时,也就是无法有第一个查询结果缓存起来,从而还是形成了缓存击穿。

一主多从

常用的分担数据库压力还有一种常用做法,就是读写分离、一主多从。咱们都是知道关系型数据库天生是不具备分布式分片存储的,也就是不支持分布式写,但是它天然的支持分布式读。一主多从是部署多台从库只读实例,通过冗余主库的数据来分担读请求的压力,路由算法可有代码实现或者中间件解决,具体可以根据团队的运维能力与代码组件支持视情况选择。

一主多从在还没找到根治方案前是一个非常好的应急解决方案,特别是在现在云服务的年代,扩展从库是一件非常方便的事情,而且一般情况只需要运维或者DBA解决就行,无需开发人员接入。当然这方案也有缺点,因为数据无法分片,所以主从的数据量完全冗余过去,也会导致高的硬件成本。从库也有其上限,从库过多了会主库的多线程同步数据的压力。

选择合适的存储系统

NoSQL主要以下五种类型:键值型、文档型、列型、图型、搜素引擎,不同的存储系统直接决定了查找算法存储数据结构,也应对了需要解决的不同的业务场景。NoSQL的出现也解决了关系型数据库之前面临的难题(性能、高并发、扩展性等)。

例如,ElasticSearch的查找算法是倒排索引,可以用来代替关系型数据库的低性能、高消耗的Like搜索(全表扫描)。而Redis的Hash结构决定了时间复杂度为O(1),还有它的内存存储,结合分片集群存储方式以至于可以支撑数十万QPS。

因此本类型的方案主要有两种:CQRS、替换(选择)存储,这两种方案的最终本质基本是一样的主要使用合适存储来弥补关系型数据库的缺点,只不过切换过渡的方式会有点不一样。

CQRS

CQS(命令查询分离)指同一个对象中作为查询或者命令的方法,每个方法或者返回的状态,要么改变状态,但不能两者兼备

讲解CQRS前得了解CQS,有些小伙伴看了估计还没不是很清晰,我这里用通俗的话解释:某个对象的数据访问的方法里,要么只是查询,要么只是写入(更新)。而CQRS(命令查询职责分离)基于CQS的基础上,用物理数据库来写入(更新),而用另外的存储系统来查询数据。因此我们在某些业务场景进行存储架构设计时,可以通过关系型数据库的ACID特性进行数据的更新与写入,用NoSQL的高性能与扩展性进行数据的查询处理,这样的好处就是关系型数据库和NoSQL的优点都可以兼得,同时对于某些业务不适于一刀切的替换存储的也可以有一个平滑的过渡。

从代码实现角度来看,不同的存储系统只是调用对应的接口API,因此CQRS的难点主要在于如何进行数据同步。

数据同步方式

一般讨论到数据同步的方式主要是分拉:

推指的是由数据变更端通过直接或者间接的方式把数据变更的记录发送到接收端,从而进行数据的一致性处理,这种主动的方式优点是实时性高。

拉指的是接收端定时的轮询数据库检查是否有数据需要进行同步,这种被动的方式从实现角度来看比推简单,因为推是需要数据变更端支持变更日志的推送的。

而推的方式又分两种:CDC(变更数据捕获)和领域事件。对于一些旧的项目来说,某些业务的数据入口非常多,无法完整清晰的梳理清楚,这个时候CDC就是一种非常好的方式,只要从最底层数据库层面把变更记录取到就可。

对于已经服务化的项目来说领域事件是一种比较舒服的方式,因为CDC是需要数据库额外开启功能或者部署额外的中间件,而领域事件则不需要,从代码可读性来看会更高,也比较开发人员的维护思维模式。

替换(选择)存储系统

因为从本质来看该模式与CQRS的核心本质是一样的,主要是要对NoSQL的优缺点有一个全面认识,这样才能在对应业务场景选择与判断出一个合适的存储系统。这里我像大家介绍一本书马丁.福勒《NoSQL精粹》,这本书我重复看了好几遍,也很好全面介绍各种NoSQL优缺点和使用场景。

当然替换存储的时候,我这里也有个建议:加入一个中间版本,该版本做好数据同步与业务开关,数据同步要保证全量与增加的处理,随时可以重来,业务开关主要是为了后续版本的更新做的一个临时型的功能,主要避免后续版本更新不顺利或者因为版本更新时导致的数据不一致的情况出现。在跑了一段时间后,验证了两个不同的存储系统数据是一致的后,接下来就可以把数据访问层的底层调用替换了。如此一来就可以平滑的更新切换。

结束

本文到这里就把八大方案介绍完了,在这里再次提醒一句,每个方案都有属于它的应对场景,咱们只能根据业务场景选择对应的解决方案,没有通吃,没有银弹。

这八个方案里,大部分都存在数据同步的情况,只要存在数据同步,无论是一主多从、分布式缓存、CQRS都好,都会有数据一致性的问题导致,因此这些方案更多适合一些只读的业务场景。当然有些写后既查的场景,可以通过过渡页或者广告页通过用户点击关闭切换页面的方式来缓解数据不一致性的情况。

  • 26
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
人事工资管理系统 1问题描述 1.1设计目的 本系统的设计目标是能够对该公司的员工的基本信息和工资信息进行添加和修改 ,根据个人信息将工资分为职务工资,职称工资和其他工资.能够调整工资标准和员 工信息,也能够调整其他工资项目,根据需要对教职员工基本信息和工资信息的查询 ,系统应该包括系统用户数据的添加,修改和删除。系统应该具有简单,易用,小巧 ,经典的特色,应该能够对高校工资管理进行优化,使其系统化,高效化,智能化。 并保证工资管理的准确性,简易性,为公司财务人员提供便利。 1.2设计背景 随着市场经济的快速发展,公司规模越来越大,员工的数量也越来越多,员工工 资管理更加的复杂,而工资管理是一项琐碎、复杂而又十分细致的工作,工资计算、 发放、核算的工作量很大,一般不允许出错,如果实行手工操作,每月发放工资须手 工填制大量的表格,这就会耗费工作人员大量的时间和精力,计算机进行工资发放工 作,不仅能够保证工资核算准确无误、快速输出,而且还可以利用计算机对有关工资 的各种信息进行统计,服务于财务部门其他方面的核算和财务处理,同时计算机具有 着手工管理所无法比拟的优点。例如:检索迅速、查找方便、可靠性高、存储量大、 保密性好、寿命长、成本低等。这些优点能够极大地提高人事工资资管理的效率,也 是企业的科学化、正规化管理,与世界接轨的重要条件。这就对人事工资管理提出了 新的要求,用计算机管理系统来管理高校工资已经成为目前的趋势,使用计算机可以 高速,快捷地完成以上工作。在计算机联网后,数据在网上传递,可以实现数据共享, 避免重复劳动,规范数据管理行为,从而提高了管理效率和水平。人事工资管理系统 便是以计算机为工具,通过对工资管理所需的信息管理,不仅把管理人员从繁琐的数 据计算处理中解脱出来,而且优化了管理体系,使其高效化,简易化,智能化,也提高 了透明度和互动性. 2系统目标和建设原则 2.1系统目标 某公司决定建立"工资管理系统",以取代单一的人工管理。根据人员基本情况表 中的职位、职称及工龄长短,决定工资表中的基本工资和岗位津贴的具体数值。根据 各部门上报的扣款表的内容决定工资表中扣款项的金额.按月汇总工资表。 2.2建设原则 根据我们确定的工资数据库的设计思想,我们提出我建设原则如下: A.高可靠性: 该系统是该公司进行工资管理、员工信息管理、日常行政管理和奖惩管理 的基础设施,要求有很高的可靠性,以此建立起稳定、实用的应用环境,因此系 统方案设计就以高可靠性为首要原则。 B.安全性: 系统平台和系统平台数据的安- —对网络系统应严格地管理,并通过防火墙和有效设置权限等方法加强系统平台 和数据的安全。 C.实用性: 选择适合公司应用规模和层次的技术,需求操作平台充分考虑其性价比和 适用性,网络管理简单方便、可维护性强,以降低系统管理、运行、维护和升 级费用,增强可使用性。 D.规范、开放:   坚持开放性和标准化原则,采用的各种系统平台、协议、技术、开发工具、 应用系统是开放的、标准化的和可维护的。 3运行环境规划 选择微软平台作为主导,一方面考虑目前微软的飞速发展,越来越多的企业在规 划内部网络时,将微软平台作为首选方案;另一方面从技术角度来讲,微软平台上的 应用无论是在开发上,还是在软件的部署上都非常容易,而且性能优越. A.开发工具与语言:visual basic 6。0 B.中文版硬件环境:CPU型号为Pentium 以上,内存128M以上。 C.系统环境:Linux及Windows98以上系统均可。 D.DBMS开发工具:MS SQL Server 2005 4需求分析说明 4。1功能需求描述 A.员工基本信息模块 员工基本信息模块具有员工信息输入、员工增删、员工信息查询三个功能,员工基 本信息包括员工号、员工姓名、员工性别、所在职位、具体职称、工龄和工资等级等 信息。员工增删实现了对数据库中员工信息的增加和删除。员工可以通过员工号或员 工姓名对员工信息进行查询。 B.工资结构设置模块 根据该公司的工资管理实际情况,本系统将工资结构分为职位工资、职称工资、 工龄工资、其他工资四部分.该模块可以对这四个工资类型设置工资等级,并对每个等 级设置工资标准. C.工资汇总模块 用户在员工信息管理模块对该员工的工资等级进行输入以后,在工资汇总模块会自 动对员工工资进行汇总。用户可以打印出工资汇总表,打印之前可以通过打印预览功 能进行打预览。 以下便是该系统的功能模块示意图: 图4.2人事工资管理系统功能模块结构图 4。3数据库设计 4。3.1数据库介绍 所谓数据库(Database)就是指按一定组织方式存储在一起的,相互有关的若 干个数据的结合,数据库管理系统(database Management System)就是一种操纵和管理
"编写: 非常6+2 "日期:2013-7-31 " "审核: "日期: " "批准: "日期: " "受控状态: "是 " "发布版次:5.0 "日期:2013-7-31 " "编号: " 变更记录 "日期 "版本 "变更说明 "作者 " "2013-7-17 "1.0 "初始文档 "匿名 " "2013-7-25 "2.0 "升级文档 "匿名 " "2013-7-29 "3.0 "升级文档 "匿名 " "2013-7-30 "4.0 "升级文档 "匿名 " "2013-7-31 "5.0 "最终文档 "匿名 " " " " " " 签字确认 "职务 "姓名 "签字 "日期 " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " 目 录 1 引言 4 1.1 预期的读者 4 1.2 数据库说明 4 1.3 目的和作用 4 2 数据库设计 4 2.1 抽象数据对象 4 2.1.1 系统主要业务分析 4 2.1.2 需求分析参考 5 2.2 系统物理结构设计 5 2.3 数据库逻辑设计 5 2.3.1 数据库设计命名规范 6 2.3.2 数据库表名汇总 7 2.3.3 数据库表结构设计 7 2.4 存储过程设计 12 2.5 触发器设计 12 2.6 Job设计 12 3 数据字典设计 13 引言 1 预期的读者 主要为本公司以及承包方的阅读者,如设计人员、开发人员等。有时可以包括客户方 的阅读者,如:业务人员、系统管理人员等。 2 数据库说明 会议管理系统采用的时当前流行的企业级数据库oracle使用的版本是9i。设计的数 据库全局数据库名为icss,开发用的表空间名是test,操作的用户名为test,密码为te st。 3 目的和作用 将业务分析,系统设计中对信息的描述进一步分析并加以总计,抽象出数据集合(数 据库表)。对数据集合做进一步分析,确定集合之间的关系并最终形成数据库物理模型 ,以便开发人员建立物理数据库数据库设计 1 抽象数据对象 1 系统主要业务分析 根据物流系统的业务流程描述,我们大致可以从中抽象出几个数据集合,如: 普通用户、会议申请、会议室管理、设备管理、会议管理 按照业务及系统功能简单总结数据对象: 用户 会议申请信息 会议审批 会议设备 2 需求分析参考 根据系统需求分析内容进一步确定数据对象。由于系统需求分析中考虑到会议室和会 议设备间有一定的区别和联系,即会议室一般包含固定设备和移动设备,两者之间并不 是并列关系而是所属关系,所以将会议室默认含有固定设备,这样,设备只有移动设备 分开,并提出单独的信息维护功能,数据库对象也进一步细化将会议设备分成,会议室 和相关设备。会议申请和会议审批操作的都是相同对象所以将两个数据对象进行合并, 其他数据对象没有变化。 总结数据对象: 用户信息 会议信息 会议室 会议设备 2 数据库结构设计 根据系统的分布式部署设计,数据库将部署到一部独立的计算机中。根据前期的分析 ,系统将有大量的数据存放入数据库。预留数据库空间500m,日增长约3m,日志空间1G ,日增长5m。 数据库位置:*oracle9ipath*/n2ms/db/ 日志位置:*oracle9ipath*/n2ms/log/ 3 数据库设计命名规范 1,表名命名规则 本数据库使用的表名一律采用有意义的小写英文字符命名,考虑将来编码方便,表名 不 使用'-'连接相关 2,表项命名规则 本数据库各个表的每个字段,依照表名命名规则,全部使用有意义的小写英文字符 命名,字段名不适用'-'连接相关字符,方便编码书写。 4 数据库逻辑设计 表设计中应注意的问题: 1.对于字符类型的字段,要仔细确认字段的可能长度。在oracle数据库设计中,一 般来说,对于定长的字符数据字段,取字符类型(char),对于不定长的,取变长字符类 型(varchar)。 2.对于以分类形式出现的字段,建议不使用字符类型,而使用数字类型。如:货物 是否配送为是或(和)否;如果用字符类型,则将这些字符串需要入库;如果使用数字 类型分别用1、0代表高职、中职、低职,则入库的是数字信息,从程序编写的角度考虑 ,后者更好维护一些,主要体现在如果是多语言版本时,我们不需要在程序中将这些字 符串信息进行判断处理。 1 数据库表名汇总 表2-1 数据库表 "数据库表名 "中文名 "文字说明 " "meet_app "会议申请信息 "保存所开会议的基本信息 " "meet_room "会议室 "保存会议室情况的相关信息" "facilty_meet "设备信息 "保存会议设备的相关信息 " "Equipment_stype "设备类型 "保存相关设备类型信息 " "users_in
" " " "学 号: " " 课 程 设 计 "题 目 "工资数据库设计 " "学 院 "计算机科学与技术学院 " "专 业 " " "班 级 " " "姓 名 " " "指导教师 "唐祖锴 " " "年" "月" "日 " 课程设计任务书 学生姓名: 专业班级: 指导教师: 唐祖锴 工作单位: 计算机学院 题目:工资数据库设计 初始条件: 某公司决定建立"工资管理系统",以取代单一的人工管理。根据人员基本情况表中的 学历、职称及受聘日期长短,决定工资表中的基本工资和岗位津贴的具体数值。根据各 部门上报的扣款表的内容决定工资表中扣款项的金额。按月汇总工资表。 要求完成的主要任务: 1. 根据上述的初始条件,进行调查分析并设计适当的属性。设计一个工资数据库,DBMS 可选Ms SQL Server、Access、VFP等。 2. 完成课程设计说明书,其格式遵守学校今年的新规定。主要内容包括:需求分析,概念 设计,逻辑设计,物理实现等。 3. 基于改数据库,最好实现一个或多个应用程序(自己确定功能),程序设计语言(工具 )任选。这一项是选作,不作硬性要求。 时间安排: 本学期第18周: 1. 消化资料、系统调查 1天 2. 系统分析 1天 3. 总体设计,实施计划 2天 4. 撰写报告 1天 指导教师签名: 年 月 日 系主任(或责任教师)签名: 年 月 日 1、系统目标 采用公司现有的软硬件及科学的管理系统开发方案,建立工资管理系统,实现企业工 资管理的计算机自动化。系统应符合公司人事、工资管理制度,并达到操作直观、方便 、实用、安全等要求。 系统功能 系统从总体上可以分为员工信息系统,工资操作系统,数据库用户系统。 1. 员工信息系统 本系统包括对员工各种基本信息(姓名、职工号、住址、联系电话、婚姻状况、出生 年月、岗位、部门号、性别)的录入、修改、查询等操作。 2. 工资操作系统 本系统包括对各种类型的基本工资的计算、生成工资表以及对员工工资的查询等操 作。 3. 数据库用户系统 本系统包括对数据库用户添加、删除及修改密码等操作。 1 功能图 由上述功能描述可得系统功能图如下: 图2-1 系统总功能图 概念分析 1 3.1、系统E-R图 由系统的分析部分可得系统的E-R图如下: 图3 -1 系统E-R图 系统的E- R图表明:本工资管理系统由数据库用户、工资表、员工信息、工资类别、部门信息、考 勤表等五部分组成。 2 3.2、数据流图 E-R 图建立了系统的数据模型,但我们还需要了解信息流与数据从输入移动到输出的过程中 所经受的变换,所以在此给出本系统的数据流图: 图3-2 数据流图 3 四、逻辑设计 以下是工资管理系统的关系模型: 员工(职工号、部门号、姓名、性别、出生年月、岗位、婚姻状况、联系电话、住址) 部门信息(部门号、岗位、部门人数) 工资类别 (岗位、基础工资、缺勤费、加班费) 工资表(职工号、工资、工资日期) 数据库用户(用户名、密码、权限) 考勤表(职工号、加班时间、缺勤天数、考勤日期) 4 五、物理设计 在SQL数据库中需要建立6个数据表:员工基本信息表、部门信息表、工资类别表、工资 表、考勤表和数据库用户表。 部门表 "列名 "数据类型 "长度 "允许空 " "部门名 "Char "10 "否 " "岗位 "Char "10 "对 " "部门人数 "int "4 "对 " 考勤表 "列名 "数据类型 "长度 "允许空 " "职工号 "Char "10 "否 " "加班时间 "Int "4 "对 " "缺勤天数 "Int "4 "对 " "考勤日期 "datetime "8 "对 " 工资类别表 "列名 "数据类型 "长度 "允许空 " "岗位 "char "10 "否 " "基础工资 "Money "8 "对 " "加班费 "Money "8 "对 " "缺勤费 "money "8 "对 " 工资表 "列名 "数据类型 "长度 "允许空 " "职工号 "char "10 "否 " "工资 "money "8 "对 " "工资日期 "datetime "8 "对 " 员工基本信息 "列名 "数据类型 "长度 "允许空 " "职工号 "Char "10 "否 " "姓名 "Char "10 "对 " "性别 "Char "10 "对 " "部门名 "Char "10 "对 " "岗位 "Char "10 "对 " "出生年月 "Char "10 "对 " "婚姻状况 "Char "10 "对 " "联系电话 "Char "10 "对 " "住址 "char "10 "对 " 数据库用户 "列名 "数据类型 "长度 "允许空 " "用户名 "Char "10 "否 " "密码 "Char "10 "对 " "
数据库设计说明书 版本:V1.0 文 档 编 号 保 密 等 级 作 者 最后修改日期 审 核 人 最后审批日期 批 准 人 最后批准日期 修订记录 日期 版本 修订说明 修订人 目 录 1 引言 1 1.1 编写目的 1 1.2 系统名称及版本号 1 1.3 电子文档编写工具 1 1.4 定义说明与符号 1 1.5 参考资料 1 2 概述 1 3 命名 1 4 实体域设计 2 4.1 担保物 2 4.2 贷款申请 2 5 表模型设计 2 5.1 聚合表Package 2 5.2 xxx Package 2 5.2.1 CDBEC_PM_CONTROL_RECORD (表) 3 5.3 系统管理 3 5.3.1 运行日志 3 5.3.2 系统代码表 3 6 物理设计 3 6.1 数据视图 3 6.2 存储空间规划 3 6.3 冗余设计 3 6.4 索引设计 4 7 数据组织 4 7.1 数据分布方式 4 7.2 数据传输与通讯 4 7.3 历史数据管理 4 7.4 数据量估计 4 引言 编写目的 本文档是对xxx项目数据库模型的概要设计,是进行CDM模型设计的基础。 系统名称及版本号 系统全称: 系统简称: 电子文档编写工具 【说明】工具名、版本号、操作系统平台。使用多种工具时,应分别说明。 Microsoft Office Word Professional Edition 2003 Microsoft Office Visio Professional Edition 2003 Sybase PowerDesigner® Version 9.5 定义说明与符号 【说明】包括对专用术语及缩略语的解释、所用到的图(物理数据模型图/功能层次图/逻辑框图/流程图等)中图符的表示与解释、屏幕界面中图标与按钮的表示与含义等。 参考资料 【说明】格式:作者,[版本号],资料来源,日期,[起止页号]。其中,《软件需求规格说明书》与《软件概要设计说明书》是必选的参考资料。 概述 模型域划分【说明】数据模型的整体划分原则,分多少个package,为什么如此划分: Package KM临时数据:用于接收KM平移过来的数据 Package 上报数据:按照上报系统的要求存储数据,供修改界面使用 命名 参照《开发银行数据平台命名规范》【说明】项目所引用的规范 项目空间CDBEC 【说明】项目所需建立的schema,如果有多个,要说明各自的用途 表前缀: 数据接收表 STA_【说明】依据规范罗列出本系统所需建立的表前缀 数据存储表 DT_ 系统管理表 SM_ 上报报文数据表 MS_ 上报过程管理表 PM_ 实体域设计 【说明】要确定模型设计的方式:星型、雪花,对于分析应用,可以按照主题域的方式进行实体域的设计 担保物 【说明】 1.从概要层次说明每类实体所反映的业务信息关系,说明实体域有多少实体。 2.通过PowerDesigner 做出实体间的主从关系,主从的数据关系及约束关系 3.在CDM模型中对字段进行解释 贷款申请 表模型设计 聚合表Package 【说明】说明聚合原因,聚合的依赖关系及层次。 xxx Package 【说明】每类package设计的原则 设计该系列表的目的是将数据复制到本地数据库后再进行计算,提高计算速度。如果未来使用数据ETL工具,虽然可以在抽取的过程中就完成大量的计算操作,但是考虑到这种工作方式需要相关系统都在线的情况下才能进行计算处理,对开发调试的环境要求较高,并且在上线运行后如果出现故障,还需要相关系统调整到位的情况下才能重新运行,因此在源到目标的数据移动过程中不进行复杂的数据运算,并且在本地保留接口数据表。 按照计算中需要从KM获取的数据表和数据项内容,进行设计,实现数据的简单平移。该部分模型需要参照目前有效发放系统、Symbols系统的表结构、命名、数据类型。 因为上报中要求对变更进行上报,当采集系统不能提供变更情况时,需要上报系统根据当天数据和前一次存储的数据进行比较之后才能知道发生了哪些业务变更。因此本系列的表需要对上报的数据保存本期和两期的数据。 CDBEC_PM_CONTROL_RECORD (表) 【说明】有特殊设计原因的表的用途,辨别此类表的方法:非业务数据存储表、实体域间的关联表、或设计规范中没有定义过的。注意不是简单解释字段的含义,而是要说明未来的系统如何使用这张表,以及表的变化更新情况 存储上报数据的概要汇总信息,每条上报数据在本表中有一条对应的存储记录。该表供查询界面中进行摘要信息显示,系统根据摘要记录再进行后续过程的处理。 在每天数据导入系统后,由系统向此表添加新的需要上报的数据。在xxx情况下该记录将被删除。…… 【说明】在CDM模型中对字段进行解释 系统管理 【说明】除了说明表的用途外,还要说明按照设计规范中的要求引用了哪些标准 运行日志 系统代码表 物理设计 数据视图 【说明】数据库视图、同义词、物化视图、DBLink的建设原因,并阐述是否存在性能问题 存储空间规划 【说明】 1.估算系统的初始数据量,增长量及周期,初始数据空间需求 2.是否建立独立的表空间,索引空间,临时表空间,使用的表空间名称 3.是否需要分区存储,哪些表进行分区存储,分区方案 冗余设计 【说明】 1.说明什么情况下进行了哪些数据项的冗余设计及原因 2.说明冗余设计后保证数据一致性的方案,如要求应用系统同步多处修改,还是系统提供变更服务 索引设计 【说明】 说明主键以外的索引原因 数据组织 数据分布方式 【说明】如集中式、分布式、混合式(集中+分布)。用图表予以描述。【说明】采用表格方式,应与数据量分布表对应。形如: 子系统名: 实体名 保存期限(天) 存放位置 CDBKM CDBFR 广域网服务器 数据传输与通讯 历史数据管理 【说明】 历史数据管理方式:备份磁带、备份表、删除 历史数据检索方式、数据恢复方式 历史数据操作方案 数据量估计 【说明】使用表格+文字的方式,对每个子系统进行估计。形如: 子系统名: 实体名 数据总量(KB) … … 本子系统数据总量= 占空系数= 预计数据量= 这里,预计数据量=本子系统数据总量×占空系数 其中,占空系数表示实际开销与理论开销之比值。其值可根据具体项目及运行环境而定,如可取1.5至2.5。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜鸟是大神

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值