首页 > 数据库 >数据库重构探讨系列(1)

数据库重构探讨系列(1)

时间:2023-03-31 12:32:23浏览次数:39  
标签:重构 数据库 探讨 耦合 数据 代码 Schema


数据库重构探讨系列

(1) 基础

 

1、数据库重构分成6类:

数据库重构探讨系列(1)_schema

2、数据库味道
与“代码味道”概念相似,代码味道是代码中出现常见问题,表明需要进行重构。
数据库味道表明数据库需要重构。这些味道包括:

(1) 多用途的列
如一个列被用于多种用途,就可能存在额外的代码来确保源数据以“正确的方式”使用,这些代码常常会检查一个列或更多其它列的值。
比如:
某列用于存储某人的生日,如果此人是顾客的话。假如此人是公司雇员,此列则用于存储入厂日期。

 

(2) 多用途的表
如一个表被用于存放几种类型的实体,就可能存在设计缺陷。
例如:
某个表Customer同时存放了人和公司的信息。

(3) 重复的数据
重复的数据对操作型数据库来说是一个严重的问题,因为如数据存放在几个地方,不一致的机会就增加了。

(4) 列太多的表
当一个表包含太多的列,则说明这个表缺乏内聚。
比如:
Customer表包含了一些列,存放了3种不同的地址(发货地址、账单地址、公司地址)或几个电话号码(家庭电话、工作电话、手机号等),你可能需要将这种结构进行标准化处理,加入Address和PhoneNumber表。

(5) “智能”列

“智能”列是这样一种列,其中数据的不同位置代表不同的概念。

例如:

客户ID的前4位数字代表客户的开户行,则客户ID就是一个“智能”列。因为你会解析它以取得更细粒度的信息,如开户行ID。


3、数据库重构

数据库重构是一种数据库实现技术,与代码重构相似,对数据库Schema进行重构,使得在上面增加东西变得容易。


数据库重构探讨系列(1)_数据库_02

上图提供了一些关键开发活动的高层视图,这些活动发生在涉及对象和关系数据库技术的现代项目中。需要在这些活动之间来回迭代。


数据库重构是演进式数据库开发的一个重要组成部分。还需要采用演进/敏捷的方式进行数据建模。

耦合越厉害,就越难重构。代码重构、数据库重构均是如此。

最简单的场景:单应用数据库。因为数据库Schema只与它本身和一个应用相耦合。

而在多应用的数据库架构中,你的数据库Schema可能与应用源码、持久框架、ORM工具、其它数据库(提供复制、数据抽取/加载等)、数据文件Schema、测试代码,甚至数据库自身等耦合在一起。


减少涉及数据库的耦合的一种有效方式是封装对数据库的访问。让外部程序通过持久层来访问数据库,可以实现对数据库访问的封装。

持久层有多种实现方式:

(1) 通过数据访问对象DAO,它实现了所需的SQL代码;

(2) 通过框架;

(3) 通过存储过程;

(4) 通过Web服务。


永远也不可能把耦合降到0,但肯定可以把它降到能管理的程度。

标签:重构,数据库,探讨,耦合,数据,代码,Schema
From: https://blog.51cto.com/prettycms/6161510

相关文章

  • JDBC和MyBatis数据库访问技术
    传统的JavaWeb应用开发时,一般使用JDBC进行数据库连接和操作SQL命令。但是,随着互联网技术的飞速发展,使用JDBC已经满足不了项目的开发需求,出现了Hibernate、MyBatis等一些优秀的持久层框架,它们结合了JDBC的优点,使得开发简捷、规范、快速,系统易维护、易扩展。1.1JDBC数据库访......
  • 数据库基础知识
    一、DB/DBSM/DBS1.数据库DataBase(DB)是信息的集合;或是由DBSM管理的数据的集合2.数据库管理系统DatabaseManagementSystem(DBSM)是一种操纵和管理DB的大型软件,通常用于建立、使用、维护DB3.数据库系统DataBaseSystem(DBS)通常由软件、DB和数据管理员组成......
  • 在 MySQL 数据库中删除重复记录的步骤
    在MySQL数据库中删除重复记录的步骤当我们在处理数据库中的数据时,有时候会出现重复记录的情况,这些重复记录会影响数据的正确性,需要将其删除。下面是在MySQL数据库中删除重复记录的步骤:1.查找重复记录首先,我们需要找到数据库表中的重复记录。可以使用以下SQL语句查询表中......
  • 深入探讨:LBS是一种工具而非一种模式
    移动互联网的快速发展,带动着移动互联网应用的不断创新。从2010起,LBS的概念就在中国迅速兴起,但到了2011年底提供LBS服务的企业从最多50家已经降至仅剩15家。投行在看好移动互联网的同时又对LBS模式产生了质疑,最后很多业内人士纷纷表示LBS+O2O会更有发展潜力。在经过2011年在LBS领域......
  • 向数据库中写入图片
            ifpose.all_save_image==0:          sql="INSERTINTOstudentmemo.student(idx,pic0)VALUES (%s,%s)"          args=(pose.id,crop)          cursor.execute(sql,args) ......
  • 为什么说数据库连接很消耗资源
    相信有过工作经验的同学都知道数据库连接是一个比较耗资源的操作。那么资源到底是耗费在哪里呢?本文主要想探究一下连接数据库的细节,尤其是在Web应用中要使用数据库来连接池,以免每次发送一次请求就重新建立一次连接。对于这个问题,答案都是一致的,建立数据库连接很耗时,但是这个耗时......
  • navicat连接云服务器数据库
    centos7拉取mysql报mysqld:Can'treaddirof'/etc/mysql/conf.d/'(Errcode:2-Nosuchfileordirectory)>mysqld:[ERROR]Fatalerrorindefaultshandling.Programaborted!此情况针对于linux云服务器拉取mysql镜像启动容器后dockerps-a查看容器状态为exit(0),容......
  • MySQL数据库面试题
    数据库三大范式是什么第一范式:每个列都不可以再拆分。第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。第三范式:在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键。在设计数据库结构的时候,要尽量遵守三范式,如果不遵守,必须有足够的理......
  • SequoiaDB分布式数据库2023.3月刊
    本月看点速览赋能行业,参编《分布式数据库金融应用发展报告》脱颖而出,入选2022专精特新黑马大赛年度十强激烈角逐,成功晋级全国信创优秀解决方案决赛新穗新彩,多家权威媒体走进巨杉青杉计划2023持续进行,一起攀登更高的“杉”赋能行业,参编《分布式数据库金融应用发......
  • pandas写入数据库
    importpandasaspdfromsqlalchemyimportcreate_engineimportnumpyasnpw=np.array([1,2,3])datas=pd.DataFrame(w)print(datas)engine=create_engine("mysql+pymysql://root:1234567890@localhost:3306/studentmemo?charset=utf8")con=engine.c......