Node + React实战:从0到1实现记账本(四)

581 阅读6分钟

项目数据库设计

前言

数据库设计,在整个软件工程的流程中,是非常重要的一环。前期的铺垫,都是为了后期开发项目时,能够顺畅一些。包括后续的迭代,都需要在数据库表设计中留下可扩展的可能性。

整个「记账本」项目有两个核心模块,第一个是用户模块,另外一个是账单模块。并且配置了三张数据表,表虽然不多,但是基础功能都有涉及到,所以有后续的需求,进行拓展。

一.数据库设计的原则

1、设计数据库的时间要充沛

数据库是用户需求的映射,设计初衷要以用户需求为中心,尽量与用户保持沟通,这里的用户可以指产品经理,亦或是提需求的人。如果遇到需求不明确的地方,设计表时就要事先预留出可变通的字段,这便是所谓的“未雨绸缪”。

2、多考虑一些性能和优化

提前预判哪些数据将会是比较大的,对于这类数据的表结构,设计的时候往往是粗粒度的,以达到用最少的表,最弱的关系去存储大量的数据。

3、添加必要的(冗余)字段

像“创建时间”、“修改时间”、“备注”、“操作用户IP”和一些用于其他需求(如统计)的字段等,在每张表中必须都要有,不是说只有系统中用到的数据才会存到数据库中,一些冗余字段是为了便于日后维护、分析、拓展而添加的,这点是非常重要的,比如黑客攻击,篡改了数据,便就可以根据修改时间和操作用户IP来查找定位。

4、设计合理的表关联

表与表之间的关系复杂的情况下,建议采用第三张映射表来维系两张张复杂表之间的关系,达到降低表之间的直接耦合度。

若多张表涉及到大数据量的问题,表结构尽量简单,关联也要尽可能避免。

接下来设计本次项目所需要用到的数据表。

二.新建项目数据库

1.用户表 user

image.png

整个记账本项目是一个面向多人注册的 C 端项目,所以需要一个个人中心模块,用户可以设置自己的头像、个性签名。但是用户名不能修改,因为用户名是用于登录使用,目前系统没有手机验证码的概念,所以这里用户名相当于用户的唯一标示。在编写注册接口的时候,也会先检验数据库中是否存在相同的用户名。这里需要再给一个创建时间,用户后续扩展业务功能,如用户使用系统的年限、根据时间划分登记等等需求。

根据上述需求分析,可以设计如下 user 表:

  • idid 字段设置为自增字段,避免认为操作导致数据重复。设置为自增之后,每次往 user 表里新增数据,都会默认 id 加 1,就算你删除了前面的数据,是不会影响到 id 的自增。后续通过鉴权,生成用户信息。账单表的存储,都会以用户作为出发点。相当于 A 用户,存储自己的账单时,都会将 A 用户的 id 带上,相当于这份账单标记了用户 A 的 id 。
  • username:用于存储用户登录名称。
  • password:用于存储用户登录密码。
  • signature:根据上图,还需要一个 signature 字段作为个性签名。
  • avatar:用于存储用户头像信息。
  • ctime:用于存储用户创建时间字段。

打开 SQLyog 选择本地数据库 localhost,新建一个 accoun-book 用于本次项目的开发数据库。 创建好之后,在 accoun-book 下创建一张 user 表,表属性就是上述提到的六个字段,如下所示:

image.png

创建的过程不再赘述,可前(三),查看创建表的相关工作。这里要注意的是,一定要给表设置好主键,我们这里设置 id 为主键。

2.账单表 bill

image.png

上图为账单首页,首页顶部有两个信息,代表当月「总支出」和「总收入」。一笔账单记为一项,每一项账单包括几个关键属性,分别是账单的类型(收入或指出)、账单的种类(服饰、交通、奖金等)、账单的金额、账单的日期时间、账单的备注(当种类无法描述清楚时使用)。

根据上述的需求分析,可以这样设计 bill 表:

  • id:每张表都需要一个主键,我们照旧,用 id 作为「账单表」的属性。
  • pay_type:账单类型,账单无非就是两种类型,支出和收入,我们用 pay_type 作为类型字段,这里约定好 1 为支出,2 为收入。
  • amount:账单价格,每个账单都需有一个价格属性,表示该笔账单你消费或收入了多少钱。
  • date:账单日期,日期可自由选择,以时间戳的形式存储。
  • type_id:账单标签 id,如餐饮、交通、日用、学习、购物等。
  • type_name:账单标签名称,如餐饮、交通、日用、学习、购物等。
  • user_id:账单归属的用户 id,本小册制作的是多用户项目,相当于可以有多个用户来注册使用,所以存储账单的时候,需要将用户的 id 带上,便于后面查询账单列表之时,过滤出该用户的账单。
  • remark:账单备注。

在上述 account-book 的基础上,新建一张 bill 表,如下所示:

image.png

保存并执行,bill 表生效。

3.标签表 type

一开始是想在前端把标签定死,比如服饰、交通、医疗等等这类账单种类,写成一个静态的对象,供前端项目使用。但是这样做有一个不好的地方,后续如果希望让用户自己添加自定义标签,就不好拓展。所以这里我们在数据库中设置一张 type 表,让用户可以灵活的设置属于自己的自定义标签。

需要给标签表设置下列属性:

  • id:唯一标识,设为主键。
  • name:标签名称,如餐饮、交通、日用、学习、购物等。
  • type:标签类型,默认 1 为收入,2 为支出。
  • user_id:保留字段,设置该标签的用户归属,默认 0 为全部用户可见,某个用户单独设置的标签,user_id 就是该用户的用户 id,在获取列表的时候,方便过滤。

在数据 account-book 中新建 type 表,如下所示:

image.png

建表工作,基本上完成了。

三.总结

一套系统,最重要的就是用户鉴权,只要用户鉴权实现之后,围绕用户可以展开多个模块的增删改查,目前就是设置一张账单表进行增删改查的演示,后续的拓展可以根据自己的需要来,比如还可以再加一张表,叫 note 表,专门用于日记的记录,此时也就是对 note 表的增删改查。