热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

数据库设计实践:你不想做的七件事

21CTO导读:如果你正在设计数据库,那么让我们看一下您不想做的七件事情有哪些。 你的数据库设计太糟糕?没人告诉你这个原因是什么?它有两个原因:无知与冷漠。他们要么不知道这是不好的

21CTO导读:如果你正在设计数据库,那么让我们看一下您不想做的七件事情有哪些。

database.jpg

 
你的数据库设计太糟糕?没人告诉你这个原因是什么?它有两个原因:无知与冷漠。他们要么不知道这是不好的,要不根本不在乎。
 
作为15年的数据库专家,我看到太多形形色色的数据库设计,有好的,有不好的,大多数时间我想骂人。
 
每当我看到一个不太好的数据库设计时,我问我自己:这些数据怎么能得到如此不好的待遇呢?数据处理的时间可能长于代码,因此应该对其进行处理。
 
因此,我希望每位开发者能尊重数据库设计的过程。在本文中我尝试指出你做错了什么,相信你以后会感谢我的。
 
以下,是在数据库设计中你不愿意做的七件事。
 
1 自己动手
 
就像看牙科一样,数据库设计最好留给专业人士,而不是你自己去做的事情。我不在乎你是否能在最后用一个花哨的镜子拿到其中一个探头,你应该停止在嘴里塞一些锋利的东西。
 
不能因为你可以做某事,但并不意味着你就可以做好。如果之前你没有设计过数据库,那么就不要将任务的关键作为您的第一个项目,请出去聘请专家来帮助你。
 
我认为迪尔.伯特总结得很好,如下图:
 

dbmanhua.jpg

 
 
2 没有表现期望(或者没有期望)
 
我参与了多个项目,根本没有任何绩效期望,直接投入生产环境时表现得“非常慢”。如果没有定义可接受的性能水平,在后面几个月中,你会很难放松。最终的结果是,我们虽然部署了系统,但是没有人会对这个过程感到满意。
 
如果没有对性能做预期,会在部署的早期就会出现一些令人头疼的问题。同样,如果你对性能有很大的期望,相信会遇到一些失望。如果你没有做任何的压力测试,有可能出现非预期的表现。
 
3 列设置的宽些,以防万一
 
我们也会经常看到数据类型被随意设置,似乎 它们无关紧要。
 
但是事实是(你可能在大学时被告知这一切)范围很重要。如果我们知道某个列的值可能值介于0到100,000之间,那么使用INT类型完全正常,不需要为该列设置成一个BIGINT数据类型。
 
为什么这很重要?BIGINT数据类型需要8个字节的存储空间,而INT只需要4个字节就可以。如果用了BIGINT,相当对于每行数据浪费4个字节。
 
嗯,听起来也不是很多,对吗?
 
那么,让我们思考一下,如果你的表有两百万行记录。将这些行乘以4个字节,就有800万字节或大约7.8MB的空间浪费。我知道听起来还不是很多,对吗?好吧,它加起来会很快。我只向你展示了一个列的一个例子,比如日期类型的字段如何?如果不需要在1900年之前或2079年之后的日期,那么使用SMALLDATETIME很可能更有用。哦,不要忘记这些字段可以编入索引,这些索引也会不必要地加宽。
 
我们总结以上这些原因,提醒大家选择正确的数据类型很重要。花点时间,努力在开始时把事情就做正确。
 
4 不检查外键作为索引的一部分
 
当然,我会假设你已经定义了外键。我见过不少数据库,几乎没有主键,外键,甚至没有定义任何索引。我不知道他们为什么这么做,但是人们肯定会找到这些问题。
 
如果你定义了外键,你应该评估,看看添加索引匹配外键是否有用,在一些情况下,这是有用的。
 
因此,应该将外键审核作为数据库设计的一部分。
 
5 索引每个列或不索引某个列
 
假设你已经设置了一些实际的性能要求,应该考虑建立索引。
 
大多数情况下,我看到数据库中使用太多的索引,这通常是使用索引工具引发的结果。大多数的文章都会提示你,索引是需要的,我们会创建十几个索引让一个查询运行得更快。
 
虽然索引非常适合帮助我们更快的读取数据,但它也会有一些副作用,会增加DUI(删除、更新、插入)语句的开销,如果表中的每个列都被添加了索引,那么任何数据插入表中时,都会增加系统的写入性能开销。
 
6 忘记数据质量
 
作为一名专业DBA,我知道我的角色一部分是专注于恢复。如果系统出现故障,我需要快速恢复数据,这是我关注的主要关键点。而数据库设计人员不用担心数据的恢复,而要把焦点关注在数据的完整性上来。
 
当你在设计数据时,需要确保考虑了数据质量。我们不能指望别人帮你这样做,想象一下,如果DBA期望其它人恢复数据,这是不可想象的事。事实上,我看到很多垃圾数据进入,垃圾出的数据库系统。
 
有很多方法强制执行某种类型的数据完整性。规范化范式只是一种方式,另一种方法是部署数据质量服务(网址:https://docs.microsoft.com/en- ... -2017),它会帮我们执行一定级别的数据质量的规则与约束。
 
7 没有数据备份与存储策略
 
我愿意打赌你现在没有超过七年的数据。无论系统如何升迁,七年的数据似乎神话一般。如果你问某人他们需要多长时间保存系统的记录,答案就是“七年”,即使真正的答案只有七周。
 
在数据库系统设计时要考虑一件事:始终在表中存储和保存好。
 
在设计数据库时,需要花时间计算将保留多少数据。知道这些信息可以帮助在占用空间越来越大的数据,预测性能和磁盘的预期。
 
小结
 
以上是我看到的好数据库如何变成糟糕数据库设计的几件事。如果你发现正在做这七件事中的任何一件事,随着时间的推移,数据库可能会越来越不好处理,同时降低性能。一起做好这七件事,与大家共勉。
 

编译:李维刚
来源:21CTO


推荐阅读
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • Iwanttogettheaverageofthedifferencebetweenthecurrenttimeandadatetimevalueinthedat ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • IT方面的论坛太多了,有综合,有专业,有行业,在各个论坛里混了几年,体会颇深,以前是论坛哪里人多 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • 本文介绍了响应式页面的概念和实现方式,包括针对不同终端制作特定页面和制作一个页面适应不同终端的显示。分析了两种实现方式的优缺点,提出了选择方案的建议。同时,对于响应式页面的需求和背景进行了讨论,解释了为什么需要响应式页面。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 2016 linux发行版排行_灵越7590 安装 linux (manjarognome)
    RT之前做了一次灵越7590黑苹果炒作业的文章,希望能够分享给更多不想折腾的人。kawauso:教你如何给灵越7590黑苹果抄作业​zhuanlan.z ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • java web 产品补丁更新技术_JavaWeb 并发:FOR UPDATE 实战,监测并解决。
    Writer:BYSocket(泥沙砖瓦浆木匠)一、前言针对并发,老生常谈了。目前一个通用的做法有两种:锁机制:1.悲观锁& ... [详细]
author-avatar
UN周_179
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有