浪花 - 数据库表设计

浪花是一个根据标签匹配好友,进行组队的系统,先考虑这个系统需要创建哪些表。

从系统的需求出发:

  • 根据标签搜索用户:用户表(存储用户信息和用户拥有的标签信息),通过"tags"标签字段进行模糊匹配,检索出符合标签的用户
  • 用户自定义标签:标签表,考虑到用户可以自定义标签,所以需要设计了一个标签表来存储标签信息和上传该标签的用户 Id(如果没有自定标签这个功能,直接在后端枚举所有标签即可,不需要创建标签表)

一、标签表

1. 标签信息(存在 user 表的 tags 字段中)

  • 性别:男 / 女

  • 学习方向:Java / C++ / Go / 前端

  • 目标:考研 / 春招 / 秋招 / 考公 / 竞赛(再细分为具体的竞赛) / 转行 / 跳槽

  • 段位:初级 / 中级 / 高级 / 王者

  • 阶段:大一 / 大二 / 大三 / 大四 / 学生 / 待业 / 已就业 / 研一 / 研二 / 研三

  • 状态:乐观 / 有点丧 / 一般

2. 建表语句

  • tag_name:标签名(唯一)
  • user_id:创建 / 上传该标签的用户 id
  • parent_id:该标签所属的父标签 id
  • 基础字段
    • create_time:标签的创建时间
    • update_time:标签的更新时间
    • is_delete:逻辑删除字段,删除标签时并不是真的将标签从表中删除,而是使用该字段来标识该标签是否被删除,标签信息仍然保存在标签表中,但是用户无法检索该标签 
-- auto-generated definition
create table tag
(
    id          bigint auto_increment comment 'id'
        primary key,
    tag_name    varchar(256)                       null comment '标签名称',
    user_id     bigint                             null comment '用户 id',
    parent_id   bigint                             null comment '父标签 id',
    is_parent   tinyint                            null comment '0 - 不是, 1 - 父标签',
    create_time datetime default CURRENT_TIMESTAMP null comment '创建时间',
    update_time datetime default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP,
    is_delete   tinyint  default 0                 not null comment '是否删除',
    constraint unique_tag_name
        unique (tag_name)
)
    comment '标签';

3. 考虑系统需求

初步定义完字段之后,考虑现有的字段能不能满足这个系统的需求,在使用场景里面进行考虑,并补充缺少的字段

  • 怎么查询所有标签,并将标签分好组?

        按父标签 id 分组✔

  • 如何根据父标签查询子标签?

         根据 id 查询✔

二、用户表

这里的用户表复用之前做过的【用户中心】项目的 user 表,字段都相同,新增一个标签信息 tags 的字段即可,

1. 补充字段 tags

  • 该字段设计为 JSON 字符串的格式,如 ['Java', '男'] ,将用户所拥有的标签信息都存储到该字段
  • 优点
    • 查询方便、不用新建关联表
    • 标签是用户的固有属性(除了该系统、其他系统可能要用到)节省开发成本
  • 缺点
    • 在原有的用户表新增一列,需要修改之前已经开发好的系统的数据库
alter table user add COLUMN tags varchar(1024) null comment '标签';

附:user 表的建表语句

-- auto-generated definition
create table user
(
    id            bigint auto_increment
        primary key,
    username      varchar(256)                           null comment '用户名',
    user_account  varchar(256)                           null comment '账号',
    avatar_url    varchar(1024)                          null comment '用户头像',
    gender        tinyint                                null comment '性别',
    user_password varchar(512) default '12345678'        not null comment '密码',
    phone         varchar(128)                           null comment '电话',
    email         varchar(512)                           null comment '邮箱',
    user_status   int          default 0                 not null comment '用户状态 0: 正常',
    create_time   timestamp    default CURRENT_TIMESTAMP null comment '创建时间',
    update_time   datetime                               null comment '更新时间',
    is_delete     tinyint      default 0                 null comment '逻辑删除',
    is_valid      tinyint      default 0                 null,
    user_role     int          default 0                 not null comment '角色',
    planet_code   varchar(512)                           null comment '星球编号',
    tags          varchar(1024)                          null comment '标签'
)
    comment '用户';

2. 添加索引

  • 标签名 tag_name

  • 上传标签的用户 id user_id

浪花 - 数据库表设计_第1张图片

浪花 - 数据库表设计_第2张图片

三、SQL 语句的分类

  • 数据查询语言 DQL
SELECT <字段名表> FROM <表或视图名> WHERE <查询条件>
  • 数据操纵语言 DML
插入:INSERT
更新:UPDATE
删除:DELETE
  • 数据定义语言 DDL:用来创建数据库中的各种对象——表、视图、索引、同义词、聚簇等
CREATE TABLE / VIEW / INDEX / SYN / CLUSTER
  • 数据控制语言 DCL:用来授予或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果,对数据库实行监视等。

你可能感兴趣的:(浪花,-,后端,数据库,java,mybatis)