• 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!!!

  • 相关阅读:
    20220316 08:00:01
    20220316 09:00:01
    20220317 16:52:15
    20220318 08:00:01
    以京东商品评论为目标网站,架构采用爬虫+Flume+Kafka+Spark Streaming+Mysql,实现数据动态实时的采集、分析、展示数据。
    20220317 16:51:17
    2022牛客寒假算法基础集训营1 ACDEFHIJL
    2022牛客寒假算法基础集训营2 ACEFGHIK(剩余待补)
    2022牛客寒假算法基础集训营2 A. 小沙的炉石(思维)
    2022牛客寒假算法基础集训营2 G. 小沙的身法(LCA)
  • 原文地址:https://www.cnblogs.com/Allen0910/p/6539498.html
Copyright © 2020-2023  润新知