浪花 - 数据库表设计
2024-01-08 22:36:04
浪花是一个根据标签匹配好友,进行组队的系统,先考虑这个系统需要创建哪些表。
从系统的需求出发:
- 根据标签搜索用户:用户表(存储用户信息和用户拥有的标签信息),通过"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
三、SQL 语句的分类
- 数据查询语言?DQL
SELECT <字段名表> FROM <表或视图名> WHERE <查询条件>
- 数据操纵语言?DML
插入:INSERT
更新:UPDATE
删除:DELETE
- 数据定义语言?DDL:用来创建数据库中的各种对象——表、视图、索引、同义词、聚簇等
CREATE TABLE / VIEW / INDEX / SYN / CLUSTER
- 数据控制语言?DCL:用来授予或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果,对数据库实行监视等。
文章来源:https://blog.csdn.net/m0_74059961/article/details/135435917
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!