个人网站记录四 - 数据库设计大致步骤

49 阅读6分钟

前言

这篇文章记录下根据网站功能设计数据库。由于是个人网站随意玩的,所以功能和开发步骤上都是比较随意的。

一般数据库设计都需要经过需求分析、概念结构设计、逻辑结构设计...等阶段。但毕竟个人网站,就没必要这么麻烦了。所以流程可能不是很规范^-^

当然了,会记录大致的设计流程,相信看完小白也能够自己设计数据库了,那么正式开始~

数据库设计

1. 根据业务逻辑创建ER图

暂时打算设计实现的功能(业务逻辑)如下。

  1. 用户注册、登录、三方登录。通过用户名、密码(或手机号、三方认证)注册|登录,用户注册时可以不填写完整信息,后面按意愿填写。
  2. 用户可以 读、点赞、收藏、评价 他人的文章。
  3. 用户可以 编辑、删除、隐藏(下架)、发布(上架) 自己的文章。
  4. 管理员可以管理所有用户或文章
  5. 可以设置文章属于某个文章分类
  6. 用户可以关注其他用户或分类

1.1 确认实体

根据上面业务逻辑可以暂时确认的实体有:用户文章管理员
而管理员可以理解为管理权限的用户,即管理员可以认为就是用户。那么暂时实体就只有 用户文章,它们应该有以下属性。

  • 用户:用户id、账号、密码、名称、头像、年龄、性别、手机号、邮箱、(三方登录:微信账号、微信身份证明、qq账号、qq身份证明...)、是否管理员、...
  • 文章:文章id、文章类别、标题、作者、描述、标签、文章内容、是否私密、是否删除、是否置顶、创建时间、修改时间、...
  • 评价:评价id、评价内容、评价的用户、父评价id、评价的文章id、是否置顶、是否审核、是否删除、...

1.2 确认实体间的关联

然后需要根据业务逻辑确认实体间动作的关联

  1. 文章是由用户创建编辑的,文章 --属于--> 用户,用户和文章有 1对多 的属于关系。
  2. 用户还可以对文章有这些动作:读、赞、藏、评。用户可以对多篇文章有这些动作,文章也可以被多个用户执行这些动作。此时用户和文章有 多对多 的关系(读、赞、藏、评)。
    某些关系在某些时候是可以归纳在一起的:比如读、赞、藏这类都比较类似,如果只是简单记录就可以归纳在一块,只需加个属性(类别)区分。
    而某些时候单独记录可能又要好一些:如当有足迹功能时候、或当有收藏集的时候,单独分离出一个关系表也许要方便点。
    至于具体如何设计这些关系,可根据具体需求情况而定。根据数据库设计范式,也为了方便后面扩展,个人建议将关系表尽量分离。

1.3 绘制E-R图

image.png 根据实体关系大致绘制的E-R图如上,绘制不是很详细,可以后面设计表时再进行优化。比如划分出文章类型、划分三方登录、用户和文章的读、赞、藏关系表分离。

2. 将E-R关系图转为关系模式

将E-R图转换成关系模型就是将E-R图的实体、属性、关联转化成关系模式,可以简单理解为就是将E-R图转成关系型数据库中表结构。 一般二元联系有这些转换规则。

  • 实体转化:实体转化为关系模式,实体属性就是关系属性,实体主键就是关系的码(主键).
  • 实体关联的转化
    • 1:1 任选一个实体的关系模式上添加另一实体的主键
    • 1:n 在n端实体的关系模式上添加另一实体的主键
    • m:n 需将关系转化成实体,关系的属性作为关系模式的属性,并添加m、n两端的实体主键

一般地,将参与联系的实体的数量称为联系的度。两个实体之间的联系度为2,称为二元联系;三个实体之间的联系度为3,称为三元联系

当前想实现的功能没有涉及三元联系的实体,此篇暂时就不具体介绍三元联系的转化了。

根据上面的E-R图可转化下面这些关系模式

  • 用户表users(用户id、账号、密码、手机号、邮箱、其他用户属性...)
  • 文章表articles(id、文章id、用户id、文章类别、文章内容、修改时间、其他文章属性...)
  • 评价表comments(评价id、用户id、文章id、父评价id、评价类别、其他评价属性...)
  • 收藏表collects(收藏id、创建时间、收藏集、其他收藏属性...)
  • 点赞表likes(id、创建时间、其他点赞属性...)
  • 足迹表records(id、创建时间、当天最后浏览时间、其他收藏属性...)

3. 数据库表优化

根据数据库设计范式优化当前关系模式。

  • 三方登录信息记录在用户表上,每增加一个三方登录都需要在用户表开辟新的属性,应拆分出一个三方登录表。
  • 用户的常规信息、账号信息可再拆分一张表,一张存用户登录、密码等信息,另一张存用户头像、年龄等信息。
  • 用户权限(是否管理员)可再拆分,通过角色来控制权限,不同角色有不同的权限。添加角色表权限表,另外角色和权限是多对多关系(一个角色可以有多个权限、多个角色可以有同一个权限);角色和用户又是多不多关系(一个用户可以有多个角色、多个用户可以有同一个角色)。即还需要角色权限关联表用户角色关联表
  • 收藏表应拆分出一张收藏分类表。

最终有以下关系表

  • 用户表users (用户id、账号、密码)
  • 用户信息表user_infos(id、用户id、账号、密码、手机号、邮箱、其他用户属性...)
  • 三方登录表user_outsides(id、用户id、认证类型、身份标识、身份证明)
  • 角色表roles(角色id、角色名称)
  • 用户角色表user_roles(id、用户id、角色id)
  • 权限表powers(权限id、权限名称)
  • 角色权限表role_powers(id、角色id、权限id)
  • 文章表articles(文章id、用户id、分类id、文章内容、修改时间、其他文章属性...)
  • 文章分类表art_cates(分类id、分类名称)
  • 评价表comments(评价id、用户id、文章id、父评价id、评价类别、其他评价属性...)
  • 收藏表collects(收藏id、创建时间、收藏集、其他收藏属性...)
  • 点赞表likes(id、创建时间、其他点赞属性...)
  • 足迹表records(id、创建时间、当天最后浏览时间、其他收藏属性...)