在目前的企业信息系统中,数据库还是最佳的数据存储方式,虽然已经有很多的书籍在指导我们进行数据库设计,但应该那种方式是设计数据库的表结构的最好方 法、设计时应遵从什么样的原则、四个范式如何能够用一种方式达到顺畅的应用等是我一直在思考和总结的问题,下文是我针对这几个问题根据自己的设计经历准备 总结的一篇文章的提纲,欢迎大家一块进行探讨,集思广益。其中提到了领域建模的概念,但未作详细解释,希望以后能够有时间我们针对这个命题进行深入探讨。

1) 不应该针对整个系统进行数据库设计,而应该根据系统架构中的组件划分,针对每个组件所处理的业务进行组件单元的数据库设计;不同组件间所对应的数据库表之 间的关联应尽可能减少,如果不同组件间的表需要外键关联也尽量不要创建外键关联,而只是记录关联表的一个主键,确保组件对应的表之间的独立性,为系统或表 结构的重构提供可能性。

2)采用领域模型驱动的方式和自顶向下的思路进行数据库设计,首先分析系统业务,根据职责定义对象。对象要符合封 装的特性,确保与职责相关的数据项被定义在一个对象之内,这些数据项能够完整描述该职责,不会出现职责描述缺失。并且一个对象有且只有一项职责,如果一个 对象要负责两个或两个以上的职责,应进行分拆。

3)根据建立的领域模型进行数据库表的映射,此时应参考数据库设计第二范式:一个表中的所 有非关键字属性都依赖于整个关键字。关键字可以是一个属性,也可以是多个属性的集合,不论那种方式,都应确保关键字能够保证唯一性。在确定关键字时,应保 证关键字不会参与业务且不会出现更新异常,这时,最优解决方案为采用一个自增数值型属性或一个随机字符串作为表的关键字。

4)由于第一点所述的领域模型驱动的方式设计数据库表结构,领域模型中的每一个对象只有一项职责,所以对象中的数据项不存在传递依赖,所以,这种思路的数据库表结构设计从一开始即满足第三范式:一个表应满足第二范式,且属性间不存在传递依赖。

5)同样,由于对象职责的单一性以及对象之间的关系反映的是业务逻辑之间的关系,所以在领域模型中的对象存在主对象和从对象之分,从对象是从1-N 或N-N的角度进一步主对象的业务逻辑,所以从对象及对象关系映射为的表及表关联关系不存在删除和插入异常。

6) 在映射后得出的数据库表结构中,应再根据第四范式进行进一步修改,确保不存在多值依赖。这时,应根据反向工程的思路反馈给领域模型。如果表结构中存在多值 依赖,则证明领域模型中的对象具有至少两个以上的职责,应根据第一条进行设计修正。第四范式:一个表如果满足BCNF,不应存在多值依赖。

7) 在经过分析后确认所有的表都满足二、三、四范式的情况下,表和表之间的关联尽量采用弱关联以便于对表字段和表结构的调整和重构。并且,我认为数据库中的表 是用来持久化一个对象实例在特定时间及特定条件下的状态的,只是一个存储介质,所以,表和表之间也不应用强关联来表述业务(数据间的一致性),这一职责应 由系统的逻辑层来保证,这种方式也确保了系统对于不正确数据(脏数据)的兼容性。当然,从整个系统的角度来说我们还是要尽最大努力确保系统不会产生脏数 据,单从另一个角度来说,脏数据的产生在一定程度上也是不可避免的,我们也要保证系统对这种情况的容错性。这是一个折中的方案。

8)应针 对所有表的主键和外键建立索引,有针对性的(针对一些大数据量和常用检索方式)建立组合属性的索引,提高检索效率。虽然建立索引会消耗部分系统资源,但比 较起在检索时搜索整张表中的数据尤其时表中的数据量较大时所带来的性能影响,以及无索引时的排序操作所带来的性能影响,这种方式仍然是值得提倡的。

9) 尽量少采用存储过程,目前已经有很多技术可以替代存储过程的功能如“对象/关系映射”等,将数据一致性的保证放在数据库中,无论对于版本控制、开发和部 署、以及数据库的迁移都会带来很大的影响。但不可否认,存储过程具有性能上的优势,所以,当系统可使用的硬件不会得到提升而性能又是非常重要的质量属性 时,可经过平衡考虑选用存储过程。

10)当处理表间的关联约束所付出的代价(常常是使用性上的代价)超过了保证不会出现修改、删除、更改 异常所付出的代价,并且数据冗余也不是主要的问题时,表设计可以不符合四个范式。四个范式确保了不会出现异常,但也可能由此导致过于纯洁的设计,使得表结 构难于使用,所以在设计时需要进行综合判断,但首先确保符合四个范式,然后再进行精化修正是刚刚进入数据库设计领域时可以采用的最好办法。

11)设计出的表要具有较好的使用性,主要体现在查询时是否需要关联多张表且还需使用复杂的SQL技巧。

12)设计出的表要尽可能减少数据冗余,确保数据的准确性,有效的控制冗余有助于提高数据库的性能。

转载于:https://www.cnblogs.com/xieon1986/archive/2012/10/23/2736021.html

转载:数据库表结构设计方法及原则相关推荐

  1. 数据库表结构设计方法

    数据库表结构设计方法 当我们设计一个数据库存储模式时,要仔细分析数据模式,不要一股脑的把所有的数据都放在一起.那样的话对系统的可用性,高效能,扩展性都会有严重的影响.当然你设计的系统非常小,完全可以用 ...

  2. 数据库表结构设计原则

    转载自:http://hi.baidu.com/yzx110/blog/item/0159fadc7b7839a4cd116686.html 数据库表结构设计浅谈 这篇文章如题所述,只打算谈一下数据库 ...

  3. 导出 MySQL 数据库表结构设计文档

    第一种 :利用sql语句查询 需要说明的是该方法应该适用很多工具,博主用的是navicat SELECT TABLE_NAME 表名,COLUMN_NAME 列名, COLUMN_TYPE 数据类型, ...

  4. ezdml 支付mysql 吗_EZDML数据库表结构设计器_设计sql、oracle、mysql数据库表结构 V2.39 免费版...

    很多程序员或者网站站长在设计网站数据库的时候都要进行表结构设计,如果您不想操作原始的数据库工具之想简单设计一下数据库表结构,那么你不妨试试这款EZDML数据库表结构设计器,可以快速设计sql.orac ...

  5. mysql 数据库表结构设计与规范

    mysql 数据库表结构设计与规范 DDL(data difinition language)就是数据定义语言. 1.sql语句的界定符 [code]– 默认情况下" ; " 代表 ...

  6. php数据库表怎么删除,php删除数据库表的方法

    php删除数据库表的方法 发布时间:2020-08-24 10:48:04 来源:亿速云 阅读:70 作者:小新 php删除数据库表的方法?这个问题可能是我们日常学习或工作经常见到的.希望通过这个问题 ...

  7. java实体类生成mysql表_springboot+mybatis通过实体类自动生成数据库表的方法

    前言 本章介绍使用mybatis结合mysql数据库自动根据实体类生成相关的数据库表. 首先引入相关的pom包我这里使用的是springboot2.1.8.RELEASE的版本 org.mybatis ...

  8. mysql表结构设计_数据库表结构设计

    1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对 应且只对应一个实体.在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证 ...

  9. 关于聊天记录数据库表结构设计

    1.首先表结构设计针对单个用户,然后拓展到n个用用户记录的存储. 2.这里会用msql数据库给出数据库表脚本,但是实际生产环境应该是在APP端生成sqlite数据库文件,把sqlite文件上传到ser ...

最新文章

  1. BeautifulSoup_第二节
  2. 英伟达CUDA太难!OpenAI出手要取代它,新语言性能相当但编程更简单
  3. zabbix监控实践解析(历史记录附近乱码、图表显示乱码)
  4. java 中文怎么截取,java String 中文 字符串 截取
  5. 全球及中国通信中的量子计算行业十四五规划方向与运营前景研究报告2022版
  6. 安装Cocoapods详细教程
  7. 删除bin后,Eclipse重新编译项目
  8. vscode 中 markdown 插件和使用
  9. 2017.3.25 矩阵快速幂 求斐波那契数列第n项
  10. string list 查找_手撕java集合源码——List篇
  11. vue 地图使用navigator_初识ABP vNext(6):vue+ABP实现国际化
  12. GitHub引入了Reactions来提供对issue和pull request的反馈
  13. 数字证书、ssl、sasl(GSSAPI,Kerberos)、jaas简单解释
  14. 打不开malloc和free函数
  15. 【ResNet】Pytorch从零构建ResNet18
  16. MySQL数据库 实验报告(一)
  17. 关于Windows api 多屏幕显示器识别ID问题。未解决
  18. 牵手华为云,云时通SRM助力企业采购数字化升级!
  19. 在QPixmap的图片上添加文字
  20. 数学建模——规划模型

热门文章

  1. linux下载命令 scp,linux命令详解之scp命令
  2. html乱码框框,springmvc+font-awesome开发出的页面显示方框乱码的解决方法
  3. 没有icon_ICON设计干货来啦~
  4. 微信小程序可以加服务器上的字体,微信小程序中自定义字体
  5. python无所不能_python-列表
  6. 宁波大学2020计算机技术复试线,宁波大学关于公布2020年硕士研究生复试分数线的通知...
  7. C++ multiset
  8. Vue商品添加到购物车
  9. 数学建模学习笔记(四)——拟合算法
  10. 【OpenCV 例程200篇】87. 频率域钝化掩蔽