毫无疑问,数据库的设计在一个系统中起了至关重要的作用。我们都知道,系统设计分为两部分,或者说是两个阶段,即数据库设计和功能设计。构建一个完善的系统需要这两个阶段的充分考量、周密设计、合理联接以及密切配合。数据库设计是整个系统的根基,它关乎系统功能的实现、稳定性、扩展性等多个方面,可见数据库设计的重要性。
那么好的数据库设计应该具备什么样的基本条件呢,大致有这么几点:
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!!!