热门标签 | 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


推荐阅读
  • 如何将955万数据表的17秒SQL查询优化至300毫秒
    本文详细介绍了通过优化SQL查询策略,成功将一张包含955万条记录的财务流水表的查询时间从17秒缩短至300毫秒的方法。文章不仅提供了具体的SQL优化技巧,还深入探讨了背后的数据库原理。 ... [详细]
  • 深入解析轻量级数据库 SQL Server Express LocalDB
    本文详细介绍了 SQL Server Express LocalDB,这是一种轻量级的本地 T-SQL 数据库解决方案,特别适合开发环境使用。文章还探讨了 LocalDB 与其他轻量级数据库的对比,并提供了安装和连接 LocalDB 的步骤。 ... [详细]
  • 优雅地记录API调用时长
    本文旨在探讨如何高效且优雅地记录API接口的调用时长,通过实际案例和代码示例,帮助开发者理解并实施这一技术,提高系统的可观测性和调试效率。 ... [详细]
  • 构建Python自助式数据查询系统
    在现代数据密集型环境中,业务团队频繁需要从数据库中提取特定信息。为了提高效率并减少IT部门的工作负担,本文探讨了一种利用Python语言实现的自助数据查询工具的设计与实现。 ... [详细]
  • 本文详细介绍了如何在本地环境中安装配置Frida及其服务器组件,以及如何通过Frida进行基本的应用程序动态分析,包括获取应用版本和加载的类信息。 ... [详细]
  • 本文深入探讨了领域驱动设计(DDD)中的聚合概念及其在事件溯源架构中的应用。聚合是一组紧密相关的类,这些类作为一个整体运作,形成一个有明确边界的组织。只有通过聚合根才能与聚合内的对象进行交互。 ... [详细]
  • 本文详细介绍了如何处理Oracle数据库中的ORA-00227错误,即控制文件中检测到损坏块的问题,并提供了具体的解决方案。 ... [详细]
  • 使用IntelliJ IDEA高效开发与运行Shell脚本
    本文介绍了如何利用IntelliJ IDEA中的BashSupport插件来增强Shell脚本的开发体验,包括插件的安装、配置以及脚本的运行方法。 ... [详细]
  • 本文探讨了如何在Sitecore 9环境中通过Postman使用API密钥发送请求,包括解决常见错误的方法。 ... [详细]
  • 本文探讨了在SharePoint环境中使用BDC(Business Data Catalog)时遇到的问题及其解决策略,包括XML文件导入SSP后的不可见性问题以及与远程SQL Server 2005连接的难题。 ... [详细]
  • 本文详细介绍了PHP中的几种超全局变量,包括$GLOBAL、$_SERVER、$_POST、$_GET等,并探讨了AJAX的工作原理及其优缺点。通过具体示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 本文探讨为何Request对象的外观设计被认为是精妙的,重点在于其如何利用门面模式确保数据安全,同时保持系统的高效交互。 ... [详细]
  • IA64架构下常见编程陷阱探讨
    本文深入探讨了IA64架构中常见的一个编程错误案例,该案例揭示了当开发者试图绕过编译器的某些限制时可能遇到的问题。通过具体分析IA64架构的特点及其对全局变量处理的方式,本文旨在为开发者提供避免此类问题的有效建议。 ... [详细]
  • Java虚拟机及其发展历程
    Java虚拟机(JVM)是每个Java开发者日常工作中不可或缺的一部分,但其背后的运作机制却往往显得神秘莫测。本文将探讨Java及其虚拟机的发展历程,帮助读者深入了解这一关键技术。 ... [详细]
  • ArcBlock 发布 ABT 节点 1.0.31 版本更新
    2020年11月9日,ArcBlock 区块链基础平台发布了 ABT 节点开发平台的1.0.31版本更新,此次更新带来了多项功能增强与性能优化。 ... [详细]
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社区 版权所有