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也可以反馈给我,感谢! 这是一套包含前后端代码的个人博客系统,欢迎各位提出建议 ...
随机推荐
- argparse 模块 在终端执行脚本文件
1.案例 #1.案例: import argparse #首先导入模块 parser = argparse.ArgumentParser() #创建一个解析对象 parser.add_argument ...
- windows server2003/2008中权限账户
在windows server 2003与windows server 2008 R2中,查看文件夹权限时,尤其是用cacls命令查看时,经常会见nt authority system这样的用户信息. ...
- Ubantu安装Odoo10学习日志
Windows安装是十分简单的,无论是何种方式,在了解大体情况下,我开始尝试下将Odoo搭建部署在Ubantu上. 1.Odoo是什么? Odoo是一个开源框架,针对ERP的需求发展出来,适合定制出符 ...
- Java基础—运算符(转载)
转载自:Java运算符 计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量.我们可以把运算符分成以下几组: 算术运算符 关系运算符 位运算符 逻辑运 ...
- 20170524 委外采购的物料BOM
目标:找委外采购订单BOM, 我的方法:1.直接在电脑中搜索关键字:2.到系统中找数据查询3.委外采购订单系统如何操作? 数据怎么做, 实施: 结果:MDBAEKET, "采购订单项目计划行 ...
- payload有效载荷(转)
payload 记载着信息的那部分数据.通常在传输数据时,为了使数据传输更可靠,要把原始数据分批传输,并且在每一批数据的头和尾都加上一定的辅助信息,比如这一批数据量的大小,校验位等,这样就相当于给已经 ...
- Django CSRF 原理分析
原文链接: https://blog.csdn.net/u011715678/article/details/48752873 参考链接:https://blog.csdn.net/clark_fit ...
- myql命令
ALTER TABLE 表名 DROP COLUMN 列名#删除某一列
- LeetCode:分割链表【86】
LeetCode:分割链表[86] 题目描述 给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前. 你应当保留两个分区中每个节点的初始相对位置. 示例 ...
- IDEA中文出现乱码解决
转自:http://lcl088005.iteye.com/blog/2284696 我是个idea的忠实用户,新公司的项目都是用eclipse做的,通过svn拉下代码后发现,注释的内容里,中文内容都 ...