02-大鸭梨博客系统数据库设计及Dapper的使用
毫无疑问,数据库的设计在一个系统中起了至关重要的作用。我们都知道,系统设计分为两部分,或者说是两个阶段,即数据库设计和功能设计。构建一个完善的系统需要这两个阶段的充分考量、周密设计、合理联接以及密切配合。数据库设计是整个系统的根基,它关乎系统功能的实现、稳定性、扩展性等多个方面,可见数据库设计的重要性。
那么好的数据库设计应该具备什么样的基本条件呢,大致有这么几点:
1、充分体现系统的需求
不管是数据库设计还是功能设计,我们最终的目的都是要实现客户的业务需求,所以数据库设计的第一准则就是要符合业务需求。
2、保证数据的准确性和一致性
在数据库设计时通过主外键、非空、限制、唯一索引等保证数据的健壮。
3、提高数据的查询效率
一个好的系统要做到流畅,信息化的作用就是要提高人们 生产力,提高效率,所以一定要保证系统的的运行效率,减少用户的等待时间,要通过合理的表结构,安排物理存储分区,增加索引等方式,提高数据的读取效率。
4、良好的扩展性
一个好的产品往往会不断的进行扩展升级,以适应不断更新的业务需求,但凡要扩展业务,必定首先涉及数据库的扩展,在数据库设计时,务必要遵循数据库设计规范,我们通常将数据库的规范到第三范式就可以了,所有的物理模型尽量达到范式要求,扩展时的原则就是尽量不要去改动原来的表结构,一旦涉及到原来的表结构,就会出现代码重写的危险。
关于数据库设计的规范,每一点我们都不容忽视,规范的约定,字段规范,表结构规范以及使用的规范,包括表的命名、字段的命名等等,这些都会为未来的系统的开发造成很大的影响。下面我针对这个简单的博客系统,进行数据库设计,其中不免会有不合理的地方,请大家批评指正,当然设计可能不会太完善,只实现基本功能。
平时我们使用的数据库设计工具一般有两个,一个是PowerDesigner,另一个是ERStudio,我个人习惯使用ERStudio,各有各的优势吧,我也只是习惯使用ERStudio而已,无需计较,看个人习惯。
再次强调,我这里的数据库设计并不是一个完整的博客系统的设计,只为了实现部分的博客的功能而设计,甚至目前数据库设计中所涉及的不一定会全部开发,我们先看下逻辑数据模型,分为两部分,一部分是关于系统用户,另一部分是关于博客内容
结构比较简单,无需多讲了吧,下面是博客的相关表:
简单说以下关于博客的相关表,首先有博客的类别,有标签,这些我们应该很熟悉了,再就是博客的内容,收藏的博客,以及浏览的博客,我们都知道关于一篇博客,其他人可以对这篇博客进行评论,也可以对别人的评论进行回复,素以在评论回复这张表里呢,被回复的ID,可能是博客的ID,也可能是别人评论的ID,与回复类型相对应,1为博客评论,2为评论回复。回复状态为是否删除。各表之间的关系应该比较简单,不多说了吧。另外再说明下,在这个博客系统中,我只实现博客的增删改查功能,其他的以后有时间再做,其目的主要是,学习.net跨平台。
已经数据库脚本以及设计放到了github上,下面我们看下Dapper的使用,主要就是数据库的连接以及增删改查,就跟我们平时用的Ado.net类似。那么Dapper到底是什么呢,Dapper一个轻量级的ORM框架,我们在项目中添加Dapper,放到我们的Service层,在这个项目中就是数据访问层了,我们一样通过Nuget包来引入它,可以看到它的解释,A high performance Micro-ORM,一个高效率可执行的轻量级的ORM框架,我们直接点击Install安装即可。安装完成以后,我们来测试下看如何使用Dapper在项目中操作数据库,我创建一个数据库操作类,以博客的类别表为例:BlogCategService.cs,在此之前先创建一个公共的连接类,即获取我们的数据库连接字符串,注意Dapper是可以支持多种数据库的,我们还是以Sql Server为例,进行操作,创建获取数据库连接的类ConnectionFactory.cs,
/// <summary>
/// 获取Sql Server数据库连接
/// </summary>
/// <returns></returns>
public static DbConnection GetOpenSqlConnection()
{
var conn = new SqlConnection("server=.;uid=sa;pwd=666666;database=DayaliBlogDB");
conn.Open();
return conn;
}
下面我们在BlogCategService类中添加数据插入的方法Insert,代码如下:
/// <summary>
/// 插入博客类别
/// </summary>
/// <returns>插入的博客类别ID</returns>
public int InsertCateg()
{
using (var conn = ConnentionFactory.GetOpenSqlConnection())
{
var resId = conn.Query<int>(@"INSERT INTO [dbo].[T_BLOG_CATELOG](CatelogName,CreateUser,UpdateUser) VALUES (@CatelogName,@CreateUser,@UpdateUser);" +
" SELECT @@IDENTITY",new { CatelogName = "Linux", CreateUser = 1, UpdateUser = 1}).First();
return resId;
}
}
操作类创建完成以后,我们在Web项目中引用我们的Model层和Service层
在Web层创建一个测试的控制器调用我们刚刚创建的插入博客大类的方法,TestController.cs
然后运行我们的Web应用程序,
Ok,我们的测试成功了!我们把这个插入的方法再进行修改,增加传参,也就是我们要插入的数据类,首先我们在Model层添加我们的博客类的实体,我这边都均已创建完成了,我们直接修改方法,不要在Service层添加对Model的引用,修改插入方法如下:
public int InsertCateg(T_BLOG_CATELOG categry)
{
using (var conn = ConnentionFactory.GetOpenSqlConnection())
{
var resId = conn.Query<int>(@"INSERT INTO [dbo].[T_BLOG_CATELOG](CatelogName,CreateUser,UpdateUser) VALUES (@CatelogName,@CreateUser,@UpdateUser);" +
" SELECT @@IDENTITY",categry).First();
return resId;
}
}
然后修改我们的控制器里面方法,改为传参,不多说了,直接编译通过:
再就是查询、修改、删除的方法了,博客里面就不再提了,有点浪费时间,我会整理完后提交代码。
这篇博客就写这么多内容。晚安!又要开始新的一周!!!Fighting!!!
02-大鸭梨博客系统数据库设计及Dapper的使用的更多相关文章
- 基于SAE+CodeIgniter3.0+管理端angularjs+前台amazeui的多用户博客系统V1.0--系统设计(一)
开发环境: 服务器系统:CentOS-6.x web服务器:Apache-2.2.x php版本:PHP-5.3.x 开发工具:sublime text 3 ,谷歌浏览器 数据库查询工具:phpmya ...
- 基于React服务器端渲染的博客系统
系统目录及源码由此进入 目录 1. 开发前准备 1.1 技术选型1.2 整体设计1.3 构建开发 2. 技术点 2.1 react2.2 redux, react-router2.3 server-r ...
- Asp.net博客系统收集和简单介绍
国内Asp.net博客系统收集和简单介绍 [转载文章,仅供个人参考,引自http://www.soyaoo.com/Blog/post/92.html] 1.ZJ-Blog程序简介:基于A ...
- 26种基于PHP的开源博客系统
26种基于PHP的开源博客系统 来源:本站原创 PHP学习笔记 以下列举的PHP开源Blog系统中,除了我们熟知的WordPress之外,大多都没有使用过,其中一些已经被淘汰,或者有人还在使用.除了做 ...
- Django快速搭建博客系统
Django快速搭建博客系统 一.开发环境 Windows 7(64bit) python 3.6 https://www.python.org/ Django 2.0 https://www. ...
- 基于开源博客系统(jpress)搭建网站
基于开源博客系统(jpress)搭建网站 JPress 使用 Java8 开发,基于流行的JFinal和Jboot框架. 目前JPress已经内置的文章和页面其实是两个模块,可以移除和新增其他模块,因 ...
- 基于开源博客系统(mblog)搭建网站
基于开源博客系统(mblog)搭建网站 上一章讲了基于jpress部署的博客系统,这一章了解一下 mblog这个开源的基于springboot的博客系统,相比与jpress 的热度fork数量要少一些 ...
- 使用Docker部署Spring-Boot+Vue博客系统
在今年年初的时候,完成了自己的个Fame博客系统的实现,当时也做了一篇博文Spring-boot+Vue = Fame 写blog的一次小结作为记录和介绍.从完成实现到现在,也断断续续的根据实际的使用 ...
- Vue、Node全栈项目~面向小白的博客系统~
个人博客系统 前言 ❝ 代码质量问题轻点喷(去年才学的前端),有啥建议欢迎联系我,联系方式见最下方,感谢! 页面有啥bug也可以反馈给我,感谢! 这是一套包含前后端代码的个人博客系统,欢迎各位提出建议 ...
随机推荐
- 关于:before :after
首先要明白一种思想:结构和样式分离. 结构和样式分离,就意味着:没有样式表,HTML文档也是一个完整的文档:没有样式表,也能正常阅读用HTML表达的所有内容.明白这种思想就能很好理解样式表中使用--- ...
- PHP的文件下载
1.通过header头部下载文件 header("Content-length: ".filesize($filename)); //指定文件下载的大小 header(' ...
- SQL语句中的Having子句与where子句
一.介绍 聚合函数如SUM, COUNT, MAX, AVG等.这些函数和其它函数的根本区别就是它们一般作用在多条记录上.而通过使用GROUP BY 子句,可以让SUM 和 COUNT 这些函数对属于 ...
- xlwt 模块 操作excel
1.xlwt 基本用法 import xlwt #1 新建文件 new_file = open('test.xls', 'w') new_file.close() #2 创建工作簿 wookbook ...
- BAPI: TRANSACTION_BEGIN的作用
大概知道是启动一个新会话, CALL FUNCTION 'TRANSACTION_BEGIN' 业务数据处理, CALL FUNCTION 'TRANSACTION_END' 详细功能不清楚. CLE ...
- Nginx配置参数说明
一.主配置段1.正常运行必备的配置#运行用户和组,组身份可以省略user nginx nginx; #指定nginx守护进程的pid文件pid path/to/nginx.pid; #指定所有work ...
- 百度地图sn计算方法说明
官方说明[有状态码的数值意义查询 和 python 转换源码]: http://lbsyun.baidu.com/index.php?title=lbscloud/api/appendix
- asp.net(c#)中String.Empty、NULL、"" 三者到底有啥区别和联系?
开门见山,首先看下面代码,你认为结果分别是什么? string str = string.Empty; string str1 = ""; string str2 = null; ...
- Putty常用属性设置
1. 使用 UTF-8避免显示乱码 2.调整 Lines of scrollback,能够回看更多的控制台输出log 3.调整颜色和字体使得看上去更舒服 4.解决数字键盘无法输入数字的问题 效果图:
- $.messager.confirm修改弹出框按钮提示文字
$.messager.confirm 默认提示语为“OK”和“Cancel”.引入中文控件后变为“确定”和“取消” <script src="../js/locale/easyui-l ...