Node项目之评分系统(二)- 数据库设计

 

经过前面的介绍,可以发现,其实这是一个非常小的入门级项目,整个功能的实现就是简单的增删改查。增加一条主题,修改一条主题,删除一条主题或评分,查看所有主题或是所有评分。根据需求得出要实现的功能,然后根据大体功能就要想如何设计数据库表。

这里我选用的是关系型数据库 MySQL,所以在项目动手之前最重要的要设计好数据库表,大家常说:一个项目数据库设计好了,基本上就完成了一大部分的工作。这么说其实是有些道理的。好的数据表设计会让后续的编程工作更加轻松。

该项目的功能简单,所以数据表自然也很简单,这里我只是创建了三个数据表:messagevote 以及 user,一个保存主题信息,一个保存评分信息,一个保存管理员账号信息。

数据库SQL语句不熟悉的可以选择一个 GUI 工具,方便数据库方面的工作,避免由于数据库方面的一些问题阻碍了整个项目的编程工作。这一点很重要,特别对于像我这样的小白来说,很有可能由于整个过程中的一点困难障碍,就阻碍了整个编程工作,甚至是放弃。

这个项目我是在Windows平台上进行了,于是选择了一个简单的 MySQL GUI 工具 MySQL-Front,创建数据库,创建表,新建测试数据等等都可以直接在软件上点点鼠标就可以完成了,大大简化了开发流程。整个数据表的设计也非常简单:

message:

  • title: 代表评分主题
  • author: 主题作者
  • average: 该主题平均分
  • status: 主题状态,是否允许评分
  • createTime: 创建时间
  • endTime: 关闭时间(该字段后来没有使用)

vote:

  • titleId: 评分的主题 id
  • voteIp: 评分者 IP,由于在内网环境,每台电脑对应一个 IP 地址
  • voteTime: 评分时间
  • voteScore: 分数

user:

这个就不多说了,用户名和密码,在这个项目里只是为了存储管理员账号使用。

由于项目比较简单以及本人是个数据库小白,所以看出这是个很简单的数据表结构,能满足该项目的需求即可。

  • 新建主题的时候,直接insert into message;
  • 删除主题的时候,delete from message ;
  • 修改主题的时候,update message ;
  • 查找的时候,select * from message。 同理,vote 评分表也是这样。

  • 在计算平均分的时候,通过 titleId 去表 vote 中查找 average(voteScore),然后更新到 message 表中即可。如下 SQL 语句:

      select avg(voteScore) average from vote v , message m where v.titleId = m.Id and v.titleId = titleId
    
  • 在检查重复评分的时候,直接查找 titleId 以及 voteIp 是否存在即可。如下 SQL 语句:

      select count(*) voteNum from vote where titleId= `titleId` and voteIp = `voteIp`
    

    当结果为0的时候,即表示没有评过分。

  • 获取每个主题的评分数量时,在 vote 表中查找对应 titleId 对应的行数即可。SQL 语句如下:

      select count(*) voteNum from vote where titleId= `Id`
    

整个后台的数据库设计大概就这些,并没有很复杂的结构。