精华内容
下载资源
问答
  • 我有一个无比可恶的同窗,问了我一个非常好的问题,怎么设计一个好的数据库,依据她这个问题,我愁闷了非常钟,而后在网上找到了下面的货色,有什么看法大家可以提出来,实在这个也是异常值得咱们程序员学习的....
     我有一个无比可恶的同窗,问了我一个非常好的问题,怎么样设计一个好的数据库,依据她这个问题,我愁闷了非常钟,而后在网上找到了下面的货色,有什么看法大家可以提出来,实在这个也是异常值得咱们程序员学习的.三克油~!
      数据库设计(Database Design)是指对一个给定的应用环境,结构最优的数据库模式,建立数据库及其应用系统,使之可能有效地存储数据,知足各种用户的应用需求(信息要求和处理要求).
      在数据库范畴内,超频,经常把使用数据库的各类系统统称为数据库应用系统.
      一、数据库和信息系统
      (1)数据库是信息系统的中心和基础,把信息系统中大量的数据按必定的模型组织起来,提供存储、维护、检索数据的
      功能,使信息系统可以方便、及时、精确地从数据库中失掉所需的信息.
      (2)数据库是信息系统的各个局部是否严密地结合在一起以及如何联合的要害所在.
      (3)数据库设计是信息系统开发和建设的重要组成部门.
      (4)数据库设计职员应当具备的技巧和常识:
      数据库的基本知识和数据库设计技术
      计算机科学的基础知识和程序设计的方法和技巧
      软件工程的原理和方法
      应用领域的知识
      二、数据库设计的特点
      数据库建设是硬件、软件和干件的结合
      三分技术,七分治理,十二分基础数据
      技术与管理的界面称之为"干件"
      数据库设计应该与应用系统设计相结合
      结构(数据)设计:设计数据库框架或数据库结构
      行为(处理)设计:设计应用程序、事务处理等
      结构和行为分别的设计
      传统的软件工程疏忽对利用中数据语义的剖析和形象,只有有可能就尽量推迟数据结构设计的决议早期的数据库设计致力于数据模型和建模方法研讨,忽视了对行动的设计
      如图:
      三、数据库设计方法简述
      手工试凑法
      设计质量与设计人员的教训和程度有直接关系
      缺少迷信实践和工程方法的支持,工程的品质难以保证
      数据库运行一段时间后常常又不同水平地发明各种问题,增加了维护代价
      规范设计法
      手工设计方
      基本思维
      过程迭代和逐渐求精
      规范设计法(续)
      典范办法:
      (1)新奥尔良(New Orleans)方法:将数据库设计分为四个阶段
      S.B.Yao方法:将数据库设计分为五个步骤
      I.R.Palmer方式:把数据库设计当成一步接一步的进程
      (2)盘算机帮助设计
      ORACLE Designer 2000
      SYBASE PowerDesigner
      四、数据库设计的基本步骤
      数据库设计的过程(六个阶段)
      1.需求分析阶段
      正确了解与分析用户需求(包括数据与处理)
      是整个设计过程的基础,是最艰苦、最消耗时间的一步
      2.概念结构设计阶段
      是整个数据库设计的症结
      通过对用户需求进行综合、演绎与抽象,形成一个独立于具体DBMS的概念模型
      3.逻辑结构设计阶段
      将概念构造转换为某个DBMS所支撑的数据模型
      对其进行优化
      4.数据库物理设计阶段
      为逻辑数据模型选取一个最适合应用环境的物理结构(包括存储结构和存取方法)
      5.数据库实行阶段
      应用DBMS提供的数据语言、工具及宿主语言,根据逻辑设计和物理设计的成果
      建立数据库,编制与调试应用程序,组织数据入库,并进行试运行
      6.数据库运行和维护阶段
      数据库应用系统经由试运行后即可投入正式运行.
      在数据库系统运行过程中必须一直地对其进行评估、调剂与修改
      设计特点:
      在设计过程中把数据库的设计和对数据库中数据处理的设计紧密结合起来将这两个方面的需求分析、抽象、设计、实当初各个阶段同时进行,彼此参照,互相弥补,以完美两方面的设计
      设计过程各个阶段的设计描写:
      如图:
      五、数据库各级模式的构成过程
      1.需求分析阶段:综合各个用户的应用需求
      2.概念设计阶段:形成独立于机器特点,独立于各个DBMS产品的概念模式(E-R图)
      3.逻辑设计阶段:首先将E-R图转换成详细的数据库产品支持的数据模型,如关联模型,造成数据库逻辑模式;然后根据用户处理的要求、保险性的考虑,在基础表的基本上再建破必要的视图(View),形成数据的外模式
      4.物理设计阶段:根据DBMS特点和处理的需要,进行物理存储部署,建立索引,形成数据库内模式
      六、数据库设计技巧
      1. 设计数据库之前(需要分析阶段)
      1) 懂得客户需求,讯问用户如何对待将来需求变化.让客户说明其需求,而且跟着开发的持续,还要时常询问客户保证其需求依然在开发的目标之中.
      2) 了解企业业务可以在当前的开发阶段节俭大批的时间.
      3) 器重输入输出.
      在定义数据库表和字段需求(输入)时,首先应检查现有的或者已经设计出的报表、查询和视图(输出)以决议为了支持这些输出哪些是必要的表和字段.
      举例:如果客户须要一个报表依照邮政编码排序、分段和乞降,你要保证其中包括了独自的邮政编码字段而不要把邮政编码糅进地址字段里.
      4) 创建数据字典和ER 图表
      ER 图表和数据字典可以让任何懂得数据库的人都明白如何从数据库中取得数据.ER图对表明表之间关系很有用,而数据字典则阐明了每个字段的用处以及任何可能存在的别号.对SQL 抒发式的文档化来说这是完整必要的.
      5) 定义标准的对象命名规范
      数据库各种对象的命名必需规范.
      2. 表和字段的设计(数据库逻辑设计)
      表设计原则
      1) 标准化和规范化
      数据的标准化有助于打消数据库中的数据冗余.标准化有好多少种情势,但Third Normal Form(3NF)通常被认为在机能、扩展性和数据完整性方面达到了最好均衡.简单来说,遵照3NF 标准的数据库的表设计原则是:"One Fact in One Place"即某个表只包括其本身根本的属性,当不是它们自身所拥有的属性时需进行分解.表之间的关系通过外键相连接.它具备以下特色:有一组表专门存放通过键衔接起来的关联数据.
      举例:某个存放客户及其有关定单的3NF 数据库就可能有两个表:Customer 和Order.Order 表不包含定单关联客户的任何信息,但表内会存放一个键值,该键指向Customer 表里包含该客户信息的那一行.
      事实上,为了效力的缘故,对表不进行标准化有时也是必要的.
      2) 数据驱动
      采用数据驱动而非硬编码的方式,很多策略变更和维护都会便利得多,大大加强系统的灵巧性和扩大性.
      举例,假如用户界面要访问外部数据源(文件、XML 文档、其他数据库等),不妨把相应的连接和门路信息存储在用户界面支持表里.还有,电脑故障的分析解决,如果用户界面履行工作流之类的义务(发送邮件、打印信笺、修改记录状态等),那么发生工作流的数据也可以存放在数据库里.角色权限管理也可以通过数据驱动来完成.事实上,如果过程是数据驱动的,你就可以把相称大的义务推给用户,由用户来维护自己的工作流过程.
      3) 斟酌各种变更
      在设计数据库的时候考虑到哪些数据字段将来可能会发生变更.
      举例,姓氏就是如斯(留神是西方人的姓氏,比如女性结婚后从夫姓等).所以,在建立系统存储客户信息时,在单独的一个数据表里存储姓氏字段,开放平台将主导互联网未来应用,而且还附加起始日和终止日等字段,这样就可以跟踪这一数据条目的变化.
      字段设计准则
      4) 每个表中都应该增加的3 个有用的字段
      dRecordCreationDate,在VB 下默认是Now(),而在SQL Server b 下默以为GETDATE()
      sRecordCreator,在SQL Server 下默认为NOT NULL DEFAULT b USER
      nRecordVersion,记录的版本标记;有助于准确解释记录中呈现null 数据或者丧失数据的起因 b
      5) 对地址和电话采用多个字段
      描述街道地址就短短一行记载是不够的.Address_Line1、Address_Line2 和Address_Line3 可以供给更大的机动性.还有,电话号码和邮件地址最好领有本人的数据表,其间存在本身的类型和标志种别.
      6) 使用角色实体定义属于某类别的列
      在需要对属于特定类别或者具有特定角色的事物做定义时,可以用角色实体来创建特定的时间关联关系,从而可以实现自我文档化.
      举例:用PERSON 实体和PERSON_TYPE 实体来描述人员.比喻说,当John Smith, Engineer 晋升为John Smith, Director 乃至最后爬到John Smith, CIO 的高位,而所有你要做的不过是改变两个表PERSON 和PERSON_TYPE 之间关系的键值,同时增加一个日期/时间字段来知道变化是何时产生的.这样,你的PERSON_TYPE 表就包含了所有PERSON 的可能类型,比如Associate、Engineer、Director、CIO 或者CEO 等.还有个替换措施就是转变PERSON 记录来反应新头衔的变化,不外这样一来在时间上无奈跟踪个人所处地位的详细时间.
      7) 抉择数字类型和文本类型尽量充分
      在SQL 中使用smallint 和tinyint 类型要特别警惕.好比,假如想看看月销售总额,总额字段类型是smallint,那么,假如总额超过了$32,767 就不能进行计算操作了.
      而ID 类型的文本字段,比方客户ID 或定单号等等都应该设置得比普通设想更大.假设客户ID 为10 位数长.那你应该把数据库表字段的长度设为12 或者13 个字符长.但这额定盘踞的空间却无需未来重构全部数据库就可以实现数据库范围的增加了.
      8) 增长删除标记字段
      在表中包含一个"删除标记"字段,这样就可以把行标记为删除.在关系数据库里不要单独删除某一行;最好采用肃清数据程序而且要细心维护索引整体性.
      3. 取舍键和索引(数据库逻辑设计)
      键挑选原则:
      1) 键设计4 原则
      为关联字段创建外键. b
      所有的键都必须唯一. b
      避免使用复合键. b
      外键老是关联唯一的键字段. b
      2) 使用系统天生的主键
      设计数据库的时候采用系统生成的键作为主键,那么实际控制了数据库的索引完整性.这样,数据库和非人工机制就有效地掌握了对存储数据中每一行的访问.采用系统生成键作为主键还有一个长处:当拥有一致的键结构时,找到逻辑缺点很轻易.
      3) 不要用用户的键(不让主键具有可更新性)
      在肯定采用什么字段作为表的键的时候,可一定要当心用户将要编纂的字段.通常的情形下不要选择用户可编辑的字段作为键.
      4) 可选键有时可做主键
      把可选键进一步用做主键,可以占有建立强盛索引的才能.
      索引使用原则:
      索引是从数据库中获取数据的最高效方式之一.95%的数据库性能问题都可以采用索引技术得到解决.
      1) 逻辑主键使用唯一的成组索引,对系统键(作为存储过程)采用独一的非成组索引,对任何外键列采用非成组索引.考虑数据库的空间有多大,表如何进行访问,还有这些访问是否重要用作读写.
      2) 大多数数据库都索引主动创建的主键字段,然而可别忘了索引外键,它们也是常常使用的键,比如运行查问显示主表和所有关联表的某条记载就用得上.
      3) 不要索引memo/note 字段,不要索引大型字段(有良多字符),这样作会让索引占用太多的存储空间.
      4) 不要索引常用的小型表
      不要为小型数据表设置任何键,如果它们常常有插入和删除操作就更别这样作了.对这些插入和删除操作的索引保护可能比扫描表空间耗费更多的时光.
      4. 数据完整性设计(数据库逻辑设计)
      1) 完整性实现机制:
      实体完整性:主键
      参照完整性:
      父表中删除数据:级联删除;受限删除;置空值
      父表中插入数据:受限插入;递归插入
      父表中更新数据:级联更新;受限更新;置空值
      DBMS对参照完整性可以有两种方法实现:外键实现机制(约束规则)和触发器实现机制
      用户定义完整性:
      NOT NULL;CHECK;触发器
      2) 用束缚而非商务规则强迫数据完整性
      采取数据库体系实现数据的完整性.这岂但包含通过尺度化实现的完整性而且还包括数据的功效性.在写数据的时候还能够增添触发器来保障数据的准确性.不要依附于商务层保证数据完整性;它不能保证表之间(外键)的完整性所以不能强加于其他完整性规矩之上.
      3) 强制唆使完整性
      在有害数据进入数据库之前将其剔除.激活数据库系统的指导完整性特征.这样可以坚持数据的干净而能迫使开发人员投入更多的时间处理过错前提.
      4) 应用查找把持数据完全性
      节制数据完整性的最佳方式就是制约用户的选择.只要有可能都应该提供应用户一个清楚的价值列表供其选择.这样将减少键入代码的毛病和曲解同时提供数据的一致性.某些公共数据特别合适查找:国度代码、状况代码等.
      5) 采用视图
      为了在数据库和应用程序代码之间提供另一层抽象,可认为运用程序树立专门的视图而不用非要应用程序直接拜访数据表.这样做还即是在处置数据库变革时给你提供了更多的自在.
      5. 其余设计技能
      1) 防止使用触发器
      触发器的功能通常可以用其他方式实现.在调试程序时触发器可能成为烦扰.假如你确切需要采用触发器,你最好集中对它文档化.
      2) 使用常用英语(或者其他任何语言)而不要使用编码
      在创立下拉菜单、列表、报表时最好按照英语名排序.如果需要编码,可以在编码旁附上用户晓得的英语.
      3) 保留常用信息
      让一个表专门寄存个别数据库信息十分有用.在这个表里存放数据库当前版本、最近检讨/修复(对Access)、关系设计文档的名称、客户等信息.这样可以实现一种简略机制跟踪数据库,当客户埋怨他们的数据库不到达盼望的请求而与你接洽时,这样做对非客户机/服务器环境特殊有用.
      4) 包括版本机制
      在数据库中引入版本控制机制来断定使用中的数据库的版本.时间一长,用户的需求总是会改变的.最终可能会要求修改数据库结构.把版本信息直接存放到数据库中更为方便.
      5) 编制文档
      对所有的快捷方法、命名标准、限度跟函数都要编制文档.
      采用给表、列、触发器等加解释的数据库工具.对开发、支持和跟踪修正非常有用.
      对数据库文档化,或者在数据库自身的内部或者单独建立文档.这样,当过了一年多时间后再回过火来做第2 个版本,出错的机遇将大大减少.
      6) 测试、测试、重复测试
      建立或者订正数据库之后,必须用用户新输入的数据测试数据字段.最主要的是,让用户进行测试并且同用户一道保证选择的数据类型满意贸易要求.测试需要在把新数据库投入实际服务之前实现.
      7) 检查设计

      在开发期间检查数据库设计的常用技术是通过其所支持的应用程序原型检查数据库.换句话说,装机小常识 CPU的概念与主要机能指标-社区电脑数码房-焦点...,针对每一种终极表白数据的原型应用,保证你检查了数据模型并且查看如何掏出数据.



    本文转自左正博客园博客,原文链接:http://www.cnblogs.com/soundcode/archive/2011/04/14/2016386.html,如需转载请自行联系原作者

    展开全文
  • 数据库系统概述(内核)本章将分为以下几部分来讲诉:目录)数据库系统概述(内核)数据库系统的一些基本概念数据库系统的一些实现问题数据库系统的一些设计问题数据库系统的一些存取问题数据库系统的一些基本概念...

    数据库系统概述(内核)

    本章将分为以下几个部分来讲诉:

    目录)

      • 数据库系统概述(内核)
    • 数据库系统的一些基本概念
    • 数据库系统的一些实现问题
    • 数据库系统的一些设计问题
    • 数据库系统的一些存取问题

    数据库系统的一些基本概念

    下面用问题的形式来回答一下一些数据库基本概念的定义:

    1. 什么是数据?
      按照百度百科的词条定义:
      数据就是数值,也就是我们通过观察、实验或计算得出的结果。数据有很多种,最简单的就是数字。数据也可以是文字、图像、声音等。数据可以用于科学研究、设计、查证、数学等。
      但在研究中的数据定义会更加宽泛,数据是:人们用来反映客观世界时记录下来可以鉴别的一些符号。当然,这些符号就有文字,数字,数据还包括多媒体数据。
    2. 数据有什么特点?
      数据是有语义的,比如说90这个数据,放在不同的情况下就有不同的含义,比如考试成绩90分,汽车车速90 km/h等等。
    3. 什么是数据库?
      数据库又叫Database,在程序员中又经常叫做DB,它的职责:
      1.就是让数据可以在计算机内可以长期的存储,同时数据又可以按照一定的数据模型组织,通俗的来讲就是表结构。
      2.可以让用户共享,就是可以让人进行crud。(Create)、(Retrieve)、(Update)、(Delete)
      3.为某个应用服务,现在的数据库可能服务的系统不止一个,但就是提供服务的意思。
      4.数据之间的关系,密切联系。
      当然,这种功能在操作系统中的文件系统也是可以做到的,但为啥用数据库系统不用文件系统这里就不过多的阐述了。
    4. 什么是数据库管理系统
      数据库管理系统又叫Database Management System (DBMS) ,就是我们通常用的用来创建和维护数据库的一些程序,比如Oracle11g,MySql等等。这里就会有人混了,咦你说的这个不是数据库吗?数据库其实就是一个存储数据的仓库,有了一些大家熟悉的数据库系统,程序员才能很好的操作数据。
      数据库系统和数据库之间还夹着操作系统呢。
    5. 什么是数据库模式?
      大学生在课堂上上数据库的课的时候老师就会讲数据库啊,有三种模式,内模式,外模式,模式(逻辑模式),但由于大学生一开始学的时候对数据库概念的不熟悉,所以就不容易弄懂,但这是内核讲解就不多阐述数据库的使用与设计过程了。

    数据库系统的一些实现问题

    接下来假装我们自己实现了一个简陋的数据库吧!暂且起名就叫Treeses DBMS吧!
    1.首先 咱DBMS要解决的第一件事就是 数据库文件怎么存储?
    第一步,我们要考虑我们的数据库要使用什么编码方式来存储,二进制?ASC-II码?

    东西都是要用文件来存储的,数据库也不例外,文件在存储器上最终都是用二进制来存储的,为了让我们看起来方便,我们这里就给咱数据库用 ASC-II码存储吧!

    于是我们就实现了细节,关系通过文件(ASC-II)存储,其中文件存在位置 /user/db/data/table/user.db里吧。

    de396aa2d43dc5d645921a0f2bc844ee.png


    以上我们就是我们的数据库表的存储,但是既然是关系型数据库,那么一些模式(表结构)总也是要存储的吧,要不然怎么知道这个表是用来干啥的呢,于是,我们需要把这个表的一个表结构存储在文件 /user/db/model/table_structure.db 里吧。

    a7deaadb7d28e4a364842b742ace707b.png


    于是乎,我们解决了表结构的存储问题。

    有了表结构,我们忽略中间的缓存,内存,索引,SQL解析等等等等的问题,我们要直接使用我们做好的SQL语句来进行查询吧!
    我们运行了以下语句:

    a23c6a144ef29c2d8639a8157f39033c.png


    然后我们要怎么处理这些个数据呢?
    第一步我们要读取table_structure.db的文件,获取user表的表结构;
    然后读取user对应的文件user.db,对于文件的每一行做检查,如果满足条件则输出,没有满足条件则跳到下一行。
    直到表结束了。

    很简单吧,接下来:
    假设我们还有一个表叫标准身材表(standard_stature.db),里面每一个身高对应一个标准的体重。
    我们运行了以下语句:

    e99943bb5cf0f5ae94db835ef2e8cdd6.png

    这个语句又应该怎么处理呢?

    第一步一样的,读取table_structure文件,获取user表和standard_stature表的表结构;
    然后我们忽略表连接的以下成本分析过程,就按规则来。
    读user文件,对于每一行数据,读standard_stature文件,对于每一行数据,生成连接元组,检查条件,若条件满足,则输出

    这个时候,Treeses DBMS就具备了定义表和一些数据操作的功能了。但是我们的Treeses DBMS存在一些什么问题呢?

    • 我们的查询效率真的很高吗?
      如果我们能先把选择操作先做了呢?那连接的操作是不是可以更少?以下做个简单的计算吧!
      假设table_structure表有1000个数据,standard_stature有100个数据,按照原来的方案。(不考虑内存)
      1000x100=100000 io。 现在,我们先对表进行筛选,比如A表满足要求的数据500条,B表满足要求的数据50条,那先两个表进行筛选的io次数 1000+50=1500,剩余的数据量为500条与50条,io次数500X50=25000次,一共使用25000+1500=16500次。很明显,效率快了将近10倍,但实际上真的是所有情况下io次数都会减少吗?这个留待读者自己思考。
    • 我们的元组实际上是平铺在磁盘上的,考虑ASCII存储的代价是否过于昂贵呢?我们要修改表的元组是否太过于麻烦呢?我们要删除表元组是否代价也很高呢?
    • 我们的数据全都是从磁盘直接读取,要知道磁盘io的代价是非常高的,我们是不是要考虑缓冲区来优化我们的数据存取效率呢?
    • 如果有很多用户一起访问,我们怎么保证数据是否是正确的呢?比如说我修改了这个数据的时候,你要在读取这个数据,怎么办?
    • 数据库缺乏索引,查询效率是不是有点低下呢?每次查询数据都要读入整个的关系呢?至于索引为什么可以提高查询效率在后续的文章中会有详细的讲解。
    • 数据库的可靠性怎么保证呢?比如说突然断电了?咱数据库是不是没有一个数据库系统出现故障的时候的一个恢复机制,容易出现数据不一致的情况?
    • 数据库怎么提供给应用程序使用?没有API?
    • 数据字典的组织是不是做的特别差呢?

    综合评价,这数据库系统是否没法商用呢(唉,时隔多年这么评价自己当初做过的数据库系统也是尴尬,大家可以去 https://github.com/nainaiguang/Treeses.git

    实际上数据库怎么表达是个很复杂的问题,在后续的文章中会陆续的说到,上面的方式只是一个简单的说明。

    数据库系统的一些设计问题

    数据库系统的设计问题指我们在使用数据库系统时候的一些问题,本文提供思路,具体学习还是要读者自己去学习。不是本系列的重点哈哈哈哈哈

    数据库模式设计的不规范可能带来的问题。如数据冗余,更新异常,插入异常,删除异常等等。

    数据库系统的一些存取问题

    就是如何定义数据库语言,数据库语言如下:

    1. 数据库定义语言 (Data Definition Language DDL),数据库存取模式
      包括:create bable;alter table drop table
    2. 数据库操作语言 (Data Manipulation Language DML),数据库存取数据
      包括:insert,delete,select update
    3. 数据库控制语言 (Data Control Language DCL) 存取访问控制信息
      包括: grant;recoke

    码字好累,各位看官支持支持,谢谢,下一文我将会为大家绘画一个数据库完整应该有的架构,以后的文章将会围绕这个架构内核进行展开,谢谢大家!

    展开全文
  • 如何设计一个数据库? Relational Database Management System (MySQL服务器逻辑架构图) 执行前: 首先数据库内容存在哪儿?——文件系统的存储管理 SQL进来后如何知道它想获取什么内容?——SQL解析 如果...

    如何设计一个数据库?

    Relational Database Management System

    (MySQL服务器逻辑架构图)

    执行前:

    首先数据库内容存在哪儿?——文件系统的存储管理

    SQL进来后如何知道它想获取什么内容?——SQL解析

    如果一直都是同一个SQL怎么减少消耗?——缓存机制

     

    执行中:

    怎么加快SQL的查询效率?——索引机制

    如果多个事务同时执行,如何保证隔离性?——锁机制

     

    其他:

    如何知道查询了哪些内容?——日志机制

    如何防止用户篡改数据?——权限划分

    如果SQL服务器不能提供服务怎么办?——容灾机制

    (MySQL服务器功能架构图)

     

    展开全文
  • 实际上大部分人尤其DB人员基本上,大部分是不会和设计业务系统数据库又半毛钱的关系,主要的原因,在于不理解业务,或者在工作中根本就接触不到,有些公司本身是由开发人员自行设计业务表,有些是...

    实际上大部分人尤其DB人员基本上,大部分是不会和设计业务系统的数据库又半毛钱的关系,主要的原因,在于不理解业务,或者在工作中根本就接触不到,有些公司本身是由开发人员自行设计业务表,有些是开发和DB人员共同设计,但实际上DB 人员的大部分工作范围在于,架构和规范类的设计,而非和业务有关的设计。

    今天并不是要说一些和架构有关的设计,例如怎么分库分表,或者怎么利用某些数据库的特性,做继承表,分区表之类的东西,而是想从业务的角度来看看程序人员到底是一般是怎么设计一些业务表,To know one's own strength and the enemy's is the sure way to victory.

    当然下面的思路完全是一个DB人员的视角来揣测开发人员的想法,所以一定有错误点,如果有,还请developers let me know, thanks.

    从一个开发人员拿到需求后,以及在排除技术栈的选择后,基本上就要和业务逻辑进行相关的分析,并且按照相关的设计理念来设计数据库表,实际上有些开发人员是不大注意表的设计的,大部分人还是遵循了三范式,当然也有一些因为架构设计中,让某些业务逻辑屈从于技术栈,当然这还是少数,大部分还是技术要屈从于业务,尤其在传统企业。

    数据表设计当中会有两个对立面

    1  数据表中数据的冗余

    2  数据库表中的数据一致性和准确性

    这两个对立面分别面对这业务逻辑中的 ,基础表和业务表,基础表冗余是大概率的事情, 而业务表的数据库都是尽量避免冗余的。

    可以考虑一下我这一样说有没有道理,一个公司的业务系统大概会模块化进行处理,例如订单进单系统,订单跟踪处理系统, 客户关系管理系统, 合同管理系统,财务系统, 客户系统,............. 

    每个系统其实都可能和其他系统会公用一些基础信息, 订单系统中有订单号,订单跟踪处理系统有订单号, 客户管理系统中是不是也有每个客户下的订单号, 而订单跟踪处理系统到流程完毕后,可能就会有合同号,合同管理系统中也会有合同号。

    一个系统和另一个关联系统中必然必须存在练习,而这个联系就和你的业务有关。

    如果我在订单跟踪处理系统中生成了合同号,那后续将信息传输到合同管理系统中,通过和合同系统中共同的合同号,就可以将订单,或者多笔订单关联到一个或多个合同号中。

    实际上这里的设计和业务息息相关,如果业务提到,一个订单必须只能有一个合同号,和多个订单可能只有一个合同号,在表设计上就会出现不同的复杂度。而这些复杂度就会影响后期数据库可能遭受的性能问题。

     

    实际上着就是表设计中,有些设计当中程序员提出多个列作为主键的一个可能的原因,因为单列可能无法作为他标识出一个元祖(行),信息的唯一定位。

    此时如果我们是DB 人员,使用的是MYSQL数据库,你是按照开发人员的意思,在一对多的情况下,让他使用多列组合的主键,还是能给他提出点其他的意见,来尽量避免多列主键?

    如果此时你仅仅告诉,他不行你必须按照数据库的规范,只能一个列作为主键,那.........

    大多数的DB 人员本身可能大部分情况都是不行然后就没有然后,让开发自己想办法,解决问题。

    另外在业务系统设计中,还存在冗余数据的一致性的问题, 例如业务系统都有一些基础信息表,每个业务系统都需要使用,那就存在多点写,和数据库表一致性的问题, 解决的方法也不少,单点写,然后通过数据库本身的功能进行信息的分发, 或者通过非数据库系统的方式,让程序方做大事务一次在多个业务系统中写入数据,在或者准备一个数据库系统,其他业务子系统直接在使用这些信息的时候来去查询这个数据库的表信息,这都是解决问题的方式方法。但到底哪种更好,哪种应该被使用那就不一定了。

    如业务子系统多,并且这些基础信息频繁的被访问,并且还要这些信息在各个子系统中不能有半秒的数据不一致。那要用什么方式方法来解决。

    在或者设计业务表,数据量比较大,那到底是根据三范式的方式来设计表,每个表中都不能有其他表中的字段信息,例如在设计一个表中分为实体和属性两类, 那如果一个实体的属性比较多,那就会造成一个表的列数很多,那到底要不要进行拆分将部分属性移除这张表,在另一张表中体现。

    又或者在分库分表中,可以通过中间件将一部分表通过hash的手段打散,一部分数据库表则全部下发到每个物理的服务器,这样做的好处是什么,为什么这样设计?

    另外根据业务中的业务逻辑,如  客户  店铺    销售  产品

    客户实体和店铺实体有关系

    客户实体和产品又实体关系

    客户实体和销售实体有关系

    甚至客户实体和客户实体本身有关系

    店铺实体和销售实体有关系

    店铺实体和客户实体有关系

    店铺实体和产品实体有关系

    产品实体和销售实体有关系

    产品实体和客户实体有关系

    产品实体和店铺实体有关系

    产品实体和产品实体有关系(例如:产品的附属品)

    销售实体和客户的关系

    销售实体和店铺的关系

    销售实体和产品的关系

    销售实体和销售的关系  (代买的关系)

    看似简单的四个实体,其实之间犹豫业务的复杂度,造成关系错综复杂,其中的业务逻辑也是层出不穷,到底客户, 店铺, 销售, 产品,这些表到底怎么设计,才能避免一些犹豫设计表时的问题(信息分的过于三范式),导致查询需要带有多个表join才能将信息捕获全,造成性能的问题。

    所以一个系统设计好,数据库本体(数据库本身的架构)要设计的好,选择的对,而上层到底怎么设计出一个符合业务逻辑的,符合数据库操作原理的数据库表,才是更上一层楼的操作。

    展开全文
  • 如图所示,想做一个日历式的待办事宜栏以记事情,请问该如何实现? ![图片说明](https://img-ask.csdn.net/upload/201801/20/1516458403_922848.jpg) 用SSM进行的开发,数据库是MySQL,请问一下数据库表应该如何...
  • 大类管理下又有很多菜单,比如大类管理一下有“小类管理”“小类管理二”“小类管理三”“小类管理四”“小类管理五”,每小类都设有增删查改的权限,应该怎么设计数据库?求救 附: [img=...
  • 大类管理下又有很多菜单,比如大类管理一下有“小类管理”“小类管理二”“小类管理三”“小类管理四”“小类管理五”,每小类都设有增删查改的权限,应该怎么设计数据库?求救 附:[img=...
  • 国庆节过了5分之四了,想想好像和没过也没有什么两样,平时没有时间做饭倒是在这节假日弥补了,犹豫到底要不要出去,最后在犹豫中在家呆着,看着别人朋友圈散发着各种,美图秀秀和Vicotory...
  • 字段的约束怎么设计呢?表与表之间的关联关系应该怎样设计呢? 博客系统数据库的整体设计如下图所示:总共涉及到五张表:用户信息表,博客信息表,博客类型表,博客评论表,博客标签表。 --创建数据库 CREATE...
  • 现在的商城系统。有些地方的表设计,我觉得挺有功夫含义的。 像开发一个商城系统。商品有各种各样的多级分类。...如果让你搞一个商城系统,那么你怎么设计?请有搞过商城的人,分享下设计思路。[/b]
  • 最近没有发表什么东西的原因是,出差了,本期的话题有点突兀,但实际上是2天内的感悟。主要的原因是公司中执掌整体架构设计的“领导”, 另谋高就了。所以地球离开谁都能转的这定律再次被证实,...
  • 之前做了一个计量检定系统,由于现在数据库的数据增加,查询操作很慢,所以经理要我把数据分级,也就是存入连个数据库中,我大体上想法是,通过不同的配置文件里面的sql连接语句连接数据库,但是不知道到底通过什么...
  • 国庆节过了5分之四了,想想好像和没过也没有什么两样,平时没有时间做饭倒是在这个节假日弥补了,犹豫到底要...上期,提到了DB 人员在一个系统设计中,基本上处于边缘化的情况,分析其原因个人认为有以下几个原因1...
  • 最近在做一个派单系统数据库设计,在设计中有些疑惑的地方中午在网上发起一个话题讨论. 我把这个讨论流程.发过来 大家可以可以看看. 也可以发表一下自己的意见. 对于主/外键/索引来说,在一些开发...
  • 面试被问到如何设计一个分布式session系统,what?这个怎么玩。以前没有遇到过这种问题啊,仔细想想好像之前系统登录的时候有用到过这个,但是 又没认真去看,基本都是封装好的登录代码,拿过来就用了!然后就简单说...
  • 怎么设计数据库 分析需求:分析业务和需要处理的数据 概要设计:设计关系图E-R图 设计数据库的步骤(个人博客) 1.收集信息,分析需求。 用户表(用户登陆注销,用户的个人信息,写博客,创建分类) 分类表...
  • 请问大家 该怎么设计 这几张表什么关系 在一个就是当用登陆的时候 SQL应该select 那个表先 是《用户表》还是《人员映射表》 页面上的如 删除 增加 修改 导出 等元素应该如何控制 当用登陆的时候 权限应该怎么...
  • 字段的约束怎么设计呢?表与表之间的关联关系应该怎样设计呢? 这是你在开始本实训之前要思考的问题。 博客系统数据库的整体设计如下图所示:总共涉及到五张表: 用户信息表; 博客信息表; 博客类型表; 博客评论...
  • 程序一共十课程,每课程每学生可以多选;...请问如何设计可以再查询的时候容易分辨 这学生选的课程 分类[img=http://hiphotos.baidu.com/zhidao/pic/item/4a36acafb1cf42587cd92ac3.jpg][/img]
  • 一般来说级菜单下有N二级菜单,在我们做管理系统的时候菜单是必不可免的。那我们应该怎么设计数据库表结构呢? 有些同学会说用三张表"父级菜单表"、"子级菜单表"、"中间关系表"...
  • 数据库】机房收费系统数据库设计

    千次阅读 热门讨论 2015-11-24 14:32:09
    现在开始机房的重构,以前用的是师哥师姐设计的数据库,现在发现自己也可以设计出来了,所以,按这步骤来自己设计一个机房收费系统数据库。 一、规划 由于机房收费系统是第二遍做的,所以在总体规划阶段很容易...
  • 在上期出差后的感想打岔后,实际上第三篇的解决问题,在出差后的升华后,解决问题的思路突然打开了。之前的想法是如何规范,如何按照数据库本身的特点来设计配合业务系统,但实际上如果你了解了上层的...
  • 两个项目,用同一个数据库(sql sever),jsp编写的管理系统,c++编写的客户端和服务器端,数据库该怎么设计才好?
  • 如果把企业的数据比做生命所必需的血液,那么数据库设计就是应用中最重要的部分。有关数据 库设计的材料汗牛充栋,大学学位课程里也有专门的讲述。不过,就如我们反复强调的那样,再好的 老师也比不过经验的教诲...
  • ![图片说明](https://img-ask.csdn.net/upload/202005/06/1588750991_702976.jpg) 最近要做一个新项目,如图类似的功能实现,数据库怎么设计比较好呢?

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,165
精华内容 466
关键字:

怎么设计一个数据库系统