JBoss 系列九十五:浅谈如何设计一个好的数据库
2014-04-21 13:30
609 查看
概述
最近阅读了一篇关于如何设计一个好的数据库的文章,本文将其分享如下。数据库的设计,底层持久化是任何Java企业应用的一个关键部分,比如第一个版本的Java发布,JDBC就作为JDK的一部分。大家肯定同意,通常情况下,数据持久化是自己应用的瓶颈所在,但不幸的是,找出问题的根源不是一个简单的事情,需要在许多领域调查。尽管当前趋势是将数据库的设计简单化,例如使用Hibernate可以自动完成数据库的设计,这样其实存在着分险,一旦数据库设计不合理,应用实现完成,重构数据库的设计会造成很大的工作量。数据库设计的一些基本原则有数据库标准化设计(normalization),数据库分区(partitioning),合理的索引(good indexing),早期的性能测试等。数据库的标准化和非标准化设计(Database normalization and denormalization)
One fundamental cornerstone of database design is normalization. Its purpose is to eliminate redundant data and support data integrity. 如下图如图:
normalized 的版本允许在不修改表结构的前提下添加更多的city
normalized 的版本有利于表的更新和插入等写操作,denormalized 的版本有利于读操作,通常考虑是 normalization 先于 denormalization。
早期性能测试如果需要denormalization设计,可以根据性能测试结果设计。基于JPA/Hibernate的设计@Embedded可以实现底层denormalization设计。
数据库的分块设计(Database partitioning)
另一个数据库设计的原则是数据的分块设计,例如当一个表中有数以亿计的数据条目时,就应该考虑分块设计的原则。通常数据库提供商就提供这种支持,但从数据库的设计角度,分块可以是水平分块和垂直分块。水平分块是将一个表分割成几个小表,如下图如上,我们将Event表水平分割成Event 2013和Event 2014,这样最大的优点是有利于查询操作,这样性能方面的优势是
查询速度快,和查询有数以亿计的数据条目的大表相比,查询一个小表性能有显著的提升
消耗内存小,查询小表时索引占用内存小
垂直分块是指根据列将大表分割成多个小表,分割后的每个小表和大表有同样多的行数。通常如果一个表中的某列为text或blob,我们可以考虑将其单独分割开,如下图为一垂直分块的示例:
如上,垂直分块好处有:
查询速度加快,和分割前大表相比查询更精确
应用层如果使用JPA/Hibernate映射配置,一对多关系懒加载可以提升性能。
使用索引
使用索引的主要目的是加快查询,即数据库读速度。尽管索引是快速查询所不可缺少的,但是创建索引同样有一些缺陷,比如数据库表中某一行的更新都需要对相应的索引做更新,数据库表中新数据的插入都需要创建想对应的索引,这样索引带来的缺陷是影响数据库写操作,如下是一些创建使用索引的建议:最多四或五个索引,通常一张表最多创建的索引不要多于四或五个
选择合适的列创建索引,比如WHERE查询所对应的列
确保索引列为小数据,基于IO操作考虑,小的索引较容易处理,比如选择整数列创建索引
选择数据唯一的列,创建索引的列不应该有多个相同的数据,索引列数据应该是唯一的
组合索引列顺序,如果创建一个组合索引,列的顺序非常重要,选择数据唯一的列为第一列。
通常为了研究索引是否创建的有效,许多数据库提供上支持一下分析方式,例如在PostgreSQL或Oracle数据库提供EXPLAIN来分析查询语句如下:
EXPLAIN SELECT * FROM product WHERE family=13;WildFly用户使用JPA/Hibernate可以创建索引,例如如下创建一组合索引:
@Table(appliesTo="tableName", indexes = { @Index(name="index1", columnNames={"column1","column2"})})
相关文章推荐
- iOS封装浅谈-一句代码弹出actionSheet,如何优雅的设计一个ActionSheetManager
- [MySQL FAQ]系列 -- 如何为一个数据库指定字符集
- BBS 设计思路系列 ---- 普通网友如何投诉一个帖子??
- 如何设计一个好的数据库
- 如何在Visual Studio 2017中使用C# 7+语法 构建NetCore应用框架之实战篇(二):BitAdminCore框架定位及架构 构建NetCore应用框架之实战篇系列 构建NetCore应用框架之实战篇(一):什么是框架,如何设计一个框架 NetCore入门篇:(十二)在IIS中部署Net Core程序
- [29] Window PowerShell DSC 学习系列----如何备份数据库和解决一个MS Server 2008上的大坑?
- 如何设计一个优秀的数据库
- BBS 设计思路系列 ---- 普通网友如何投诉一个帖子??
- 如何设计一个优秀的数据库
- 如何设计一个优秀的数据库
- 运维角度浅谈MySQL数据库优化一个成熟的数据库架构并不是一开始设计就具备高可用、高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善。这篇博文主要谈MySQL数据库发展周期中所面临的问题及优化方
- 数据库设计——如何利用一个整数型字段为用户打上63个标
- 如何设计一个无限分类的数据库
- 如何设计一个优秀的数据库(转)
- 如何设计一个数据库中间件(支持百亿级别数据存储)
- sql优化:从设计表结构开始(SQL Server中如何让数据库中某一个字段随时间自动更新?)
- 如何设计一个数据库中间件(支持百亿级别数据存储)
- 关于如何形成一个好的数据库设计
- 如何才能做一个好网站系列 第四篇 开始设计方案,关于框架的选择
- 如何设计一个优秀的数据库