PowerDotNet平台化软件架构设计与实现系列(02):数据库管理平台
为了DB复用和简化管理,我们对常见应用依赖的DB模块进行更高级的提取和抽象。
虽然一些ORM可以简化DB开发,但是我们还是需要进行改进和优化,否则应用越多,后期管理运维越混乱。
根据常见开发需要,数据库连接串、数据库元数据管理基本上是合格的开发人员必须要用到的功能。
一、数据库连接
数据库连接串管理起来不难,但是写法随意可能造成编程开发的混乱。
通常我们写的应用程序,如果要访问数据库,除了调用远程API服务,基本都会配置一个或多个数据库连接串,有数据库密码安全需要的还需要配置安全模块。随着应用增多,数据库连接串使用容易失控。我个人在某厂碰到过某大型CS结构的应用程序,WinForm客户端赫然写着各种数据库连接串,真是呵呵哒。
我们通常按照实际BU业务进行模块划分,然后将业务数据落地保存至各自的DB中。
PowerDotNet数据管理平台提供了一些简单工具和接口,方便开发人员管理数据库连接,我们把数据库简易连接功能称为DBKey或DBRoute(本系列统称为DBKey,感谢前厂友情提供命名),根据一个DBKey可以快速获取实际连接串。
除了传统的RDBMS关系型数据库,也支持NoSQL、NewSQL、ETCD及Redis之类的缓存连接串管理。
根据DBKey的设计初衷,所有业务系统,只有DBKey根服务需要配置一次带有用户名和密码的数据库连接串,其他地方直接配置DBkey就可以把问题都搞定。
二、元数据
1、数据库服务器
2、字段管理
其他相关元数据管理,如:
(1)数据表
表和字段查询
仅表查询
(2)视图
(3)存储过程
(4)函数
(5)触发器
相对而言触发器已经用的非常少了。
(6)索引
PowerDotNet可以像主流RDBMS管理工具一样实现对数据库执行基本的增删改查操作,元数据管理也在持续完善中,常见的死锁分析、耗时统计、最耗IO的查询、统计SQL语句执行次数、慢查询等功能会根据不同数据库类型陆续集成进来,最终目标是做到完善的DML、DDL和DCL管理控制。
PowerDotNet已经实现了对关系型数据库SQLServer、MySQL(MariaDB)、PostgreSQL和MariaDB的元数据完全支持,也预留了接口用于扩展支持更多类型的数据库。
实际上数据库管理非常复杂,个人开发只用到常用功能,后续文章还会提到如何高效开发数据库应用。
三、代码生成器
如果熟悉常见的代码生成器,大家都能想到这主要是用来生成单表对应的实体、DAL、Json数据、DDL、存储过程、常用SQL、Form表单、JS(或VUE、TypeScript等)和没啥特殊逻辑的BLL的。
通常代码生成器生成的业务逻辑可以忽略,不要低估业务逻辑的复杂度,根据经验,写业务逻辑代码同样需要非常出色扎实的编程功底,建议大家老老实实写业务逻辑,而DAL层几乎可以不用改动。
代码生成器默认支持SQLServer、MySQL(MariaDB)、PostgreSQL三种数据库的代码生成,这也是PowerDotNet默认支持的三种常用关系型数据库。
配合DBKey功能,可以省去一堆配置和代码,对于一般应用的DAL开发那是相当的爽,谁用谁知道。
1、WinForm版代码生成器
2、Asp.Net MVC版代码生成器
相对WinForm版本,个人更推崇Web版本的代码生成器。
(1)支持DBKey或者连接串直连模式
(2)丰富的代码生成和下载选型
(3)代码生成和元数据查看
查看生成代码,下图示例是生成的业务逻辑对象截图。
很多代码生成器生成的业务逻辑代码都是直接调用DAL方法,其实非常让人无语,完全没有“业务逻辑”的存在。PowerDotNet代码生成器生成的业务逻辑代码,业务逻辑丰富,常见校验、判重、查询边界、批量处理、缓存等应有尽有。
查看表结构
(4)数据库文档生成
对数据库的管理和抽象,可以快速提高我们的开发效率。论针对数据库的应用开发,配合PowerDotNet自研的ORM工具,很多SQL都可以简化,DAL层完全可以自动化一行SQL不写。不过这是另外的开发问题了,本文不做探讨。
真实情况下,DB管理平台可以扩展开发出很多功能,比如数据元数据管理、SQL变更管理、SQL版本管理、Job管理等,本文示例图片主要用于展示开发常用的功能,其他功能没做介绍。
四、未来计划
目前PowerDotNet自研的数据库管理平台,前端用到sql-formatter组件,后端SQL使用了C#版本的SQL formatter(TGSqlParser),对基本的常用SQL进行语法合规性校验是没什么大问题的,但是对于复杂SQL还是略有不足。
业务数据库开发过程中常见的数据统计、动态执行万能SQL、动态报表生成等虽然都有相应模块支持,但是还不是很完善,主要是复杂度上去以后还是不容易维护。
Yearning和Archery是流行的SQL审核查询和工单管理平台,数据库管理的基本功能都有,前厂的数据库工单系统就参考了这两个开源项目。
PowerDotNet的DB管理平台未来也向DB工单功能靠拢,但是计划是独立出一个工单系统来做(最近还很忙,数据库工单系统这篇文章来不及写了^_^),包含数据库工单,将数据库变更、版本控制和回滚这几个最重要功能开发出来,而不是所有都集成在当前的数据库管理平台里。
根据我的理解,数据库管理平台可以最大程度降低数据库开发的混乱无序程度,哪怕是非生产环境的数据库也要严格管理起来。我在某厂的时候开发人员已经没有可能直连数据库“乱写乱画”了。开发使用数据库管理平台的目标和意义,就是最大可能规范开发人员,解放DBA、运维人员和业务支持,咩哈哈。
参考:
https://github.com/zeroturnaround/sql-formatter
https://docs.microsoft.com/en-us/dotnet/api/microsoft.sqlserver.transactsql.scriptdom.tsqlparser
https://www.nuget.org/packages/gudusoft.gsqlparser
PowerDotNet平台化软件架构设计与实现系列(02):数据库管理平台的更多相关文章
- PowerDotNet平台化软件架构设计与实现系列(03):系统应用平台
为了复用和解耦,快速开发更多的系统和应用,我们对自己经常说的"系统"和"应用"进行更高级的提取和抽象. 十多年前入行,辗转至今,写过很多很多应用,个人喜欢分门别 ...
- PowerDotNet平台化软件架构设计与实现系列(01):基础数据平台
本系列我将主要通过图片和少许文字讲解通过个人自研的PowerDotNet进行快速开发平台化软件产品. PowerDotNet不仅仅是包含像Newtonsoft.Json.Dapper.Quartz.R ...
- PowerDotNet平台化软件架构设计与实现系列(05):ETCD分布式键值存储平台
ETCD目前在PowerDotNet已经被用于注册中心和配置管理(常见的配置中心在PowerDotNet中仅仅是一个小小的模块而已)中,作为基础设施的重要组成部分,ETCD的重要性不言而喻. 本文简单 ...
- PowerDotNet平台化软件架构设计与实现系列(13):应用监控平台
本文再写一篇和具体业务逻辑几乎无关的公共服务应用监控平台.PowerDotNet自研的应用监控平台系统,是服务治理的重要拼图,和服务治理平台配合使用效果更好. 监控开源产品非常丰富,站在巨人的肩膀上, ...
- PowerDotNet平台化软件架构设计与实现系列(08):缓存平台
几乎所有后端应用都会或多或少用到缓存,尤其是分布式缓存服务,以及和本地缓存构造的二级缓存.根据我们一贯的节约代码的风格,为了复用的目标,抽象出缓存平台,进行缓存管理. 考虑到很多公司都会自己造或者直接 ...
- PowerDotNet平台化软件架构设计与实现系列(11):日志平台
所有后端应用几乎都会记录日志,日志系统可以统一抽象出来提供服务. 最近被Log4j2的安全漏洞刷屏了,作为开发人员的我只能咩哈哈几次表示日志处理太难了,只有折腾过的人才知道这里面的艰辛啊. 在实现Po ...
- PowerDotNet平台化软件架构设计与实现系列(12):HCRM人员管理平台
技术服务于业务,良好的技术设计和实现能够大幅提升业务质量和效率. PowerDotNet已经形成了自己的开发风格,很多项目已被应用于生产环境,可行性可用性可靠性都得到了生产环境验证. 编程是非常讲究动 ...
- PowerDotNet平台化软件架构设计与实现系列(07):数据同步平台
上文介绍定时任务调度平台的时候提到,定时任务调度平台的类模式一般用于处理耗时较长的任务.但是根据经验,有些耗时较长的任务,可以通过简化业务逻辑.分页.批量多次处理,改造为耗时较小的适合使用RESTfu ...
- PowerDotNet平台化软件架构设计与实现系列(09):消息平台
消息队列已经几乎成为大中型高吞吐应用的标配,继续根据我们一贯的节约代码的风格,为了复用的目标,抽象出消息队列平台,进行消息队列管理. 环境准备 1.(必须).Net Framework4.5+ 2.( ...
随机推荐
- gradle依赖冲突
# 如何定位依赖冲突? 了解如何定位依赖冲突问题之前,我们先手动制造一个依赖冲突. 我们在 build.gradle 引入两个依赖库: compile 'org.hibernate:hibernate ...
- java和js中for循环的区别
java中for循环,先执行语句后循环 for (int i=1;i<10;i++){ for(int b=1;b<=i;b++){ System.out.print(b+"*& ...
- TDSQL MySQL版基本原理-水平分表 读写分离 弹性扩展 强同步
TDSQL MySQL版(TDSQL for MySQL)是部署在腾讯云上的一种支持自动水平拆分.Shared Nothing 架构的分布式数据库.TDSQL MySQL版 即业务获取的是完整的逻辑库 ...
- GetX代码生成IDEA插件,超详细功能讲解(透过现象看本质)
前言 本文章不是写getx框架的使用,而且其代码生成IDEA插件的功能讲解 我之前写过俩篇很长很长的getx文章 一篇入门使用:Flutter GetX使用---简洁的魅力! 一篇原理深度剖析:Flu ...
- shell循环语句for
1.方式1 for i in {list[0]} {list[1]} .. do 执行命令 done 2.方式2(三要素循环) for (( 初始值; 判断值; 步长; )) do 执行命令 done
- 利用job提升马哈鱼数据血缘分析效率
利用job提升马哈鱼数据血缘分析效率 一.Job基本知识 前面文章中已介绍马哈鱼的基本功能,其中一个是job,job其实是一个任务集合处理的概念,就是让用户通过job,可以一次递交所有需要处理的 SQ ...
- openswan协商流程之(四):main_inI2_outR2()
主模式第四包:main_inI2_outR2 1. 序言 main_inI2_outR2()函数是ISAKMP协商过程中第四包的核心处理函数的入口,同时在此处理流程中已经获取到足够的隧道信息,可以生成 ...
- 树莓派的kodi设置遥控器的方法
首先你需要买一个红外接收器,根据卖家的文档,插到树莓派的GPIO串口上, 我的红外接收器是18入口,17出口, 所以我的config.txt文件设置如下 dtoverlay=lirc-rpi,gpio ...
- 解读Flex布局及其基本使用
Flex布局的基本内容: felx布局意为"弹性布局",主要用于为盒状模型提供最大的灵活性.被广泛的应用于移动端,PC端的响应式布局. 首先:定义盒子为flex布局: .box{ ...
- javascript 自定义事件 发布-订阅 模式 Event
* javascript自定义事件 var myEvent = document.createEvent("Event"); myEvent.initEvent("myE ...