使用场景描述:
我们公司内部的一个系统,员工每次创建一个记录,可以给这个记录加标签。其中,有5个标签是固定的,提前设置好的,员工可以改掉它们,还可以添加自定义的标签。这个标签只有他自己能看到。我觉得这个功能需求跟Github的issue中提供的标签系统很像,但是不知道怎么设计数据库结构。
请问,这个场景下,使用MySQL数据库该怎么设计表结构啊?如果有必要,我们可以使用Redis。
请各位大神帮帮忙。
我问了一下GPT: 在 MySQL 数据库中,可以设计三张表来实现这个标签功能:
tags 表,用于存储所有的标签,包括固定的标签和用户自定义的标签。表结构如下:
CREATE TABLE tags (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL UNIQUE,
is_fixed BOOLEAN NOT NULL DEFAULT FALSE
);
在这个表中,id 是标签的唯一标识符,name 是标签的名称,is_fixed 表示这个标签是否是固定的标签。如果 is_fixed 为 TRUE,则表示这个标签是固定的,否则是用户自定义的标签。这个表中应该先插入固定的标签,再插入用户自定义的标签。
taggings 表,用于记录每个记录与哪些标签相关联。表结构如下:
CREATE TABLE taggings (
id INT PRIMARY KEY AUTO_INCREMENT,
record_id INT NOT NULL,
tag_id INT NOT NULL,
FOREIGN KEY (record_id) REFERENCES records(id),
FOREIGN KEY (tag_id) REFERENCES tags(id)
);
在这个表中,id 是标签关系的唯一标识符,record_id 是记录的唯一标识符,tag_id 是标签的唯一标识符。这个表中应该插入每个记录和与之相关联的标签。
taggings_private 表,用于记录每个用户自定义的标签与哪些记录相关联。表结构如下:
CREATE TABLE taggings_private (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
record_id INT NOT NULL,
tag_id INT NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(id),
FOREIGN KEY (record_id) REFERENCES records(id),
FOREIGN KEY (tag_id) REFERENCES tags(id)
);
在这个表中,id 是标签关系的唯一标识符,user_id 是用户的唯一标识符,record_id 是记录的唯一标识符,tag_id 是标签的唯一标识符。这个表中应该插入每个用户自定义的标签和与之相关联的记录。
javascript 代码
const tags = {
fixed: [
{ id: 1, name: '优先级高', color: '#f56c6c' },
{ id: 2, name: '优先级中', color: '#e6a23c' },
{ id: 3, name: '优先级低', color: '#909399' },
{ id: 4, name: '已完成', color: '#67c23a' },
{ id: 5, name: '已取消', color: '#909399' },
],
custom: [
{ id: 6, name: '技术问题', color: '#409EFF' },
{ id: 7, name: '需求变更', color: '#67C23A' },
// ... 可以添加更多的自定义标签
]
}
const tags = {
1: {
id: 1,
name: 'bug',
created_at: '2022-10-01T08:00:00.000Z',
updated_at: '2022-10-01T08:00:00.000Z',
taggings: [
{ id: 1, tag_id: 1, taggable_id: 1, taggable_type: 'Issue' },
{ id: 2, tag_id: 1, taggable_id: 2, taggable_type: 'Issue' },
{ id: 3, tag_id: 1, taggable_id: 3, taggable_type: 'Issue' }
],
taggings_private: [
{ id: 1, tag_id: 1, taggable_id: 4, taggable_type: 'Issue', user_id: 100 }
]
},
2: {
id: 2,
name: 'feature',
created_at: '2022-10-01T08:00:00.000Z',
updated_at: '2022-10-01T08:00:00.000Z',
taggings: [
{ id: 4, tag_id: 2, taggable_id: 1, taggable_type: 'Issue' },
{ id: 5, tag_id: 2, taggable_id: 2, taggable_type: 'Issue' }
],
taggings_private: []
},
// ...
};
CabloyJS开源全栈框架提供的用户标签的设计,跟你描述的场景是一致的,可以参考一下:
- 便捷的数据管理:用户星标、红橘双色提示
- 再议红橘双色提示
- 创建一个CabloyJS项目,就可以通过Mysql看到完整的数据表设计,分别是:
aLabel:用户标签表 aAtom:数据表 aAtomLabel:数据与标签关联表 aAtomLabelRef:数据与标签关联展开表。因为一条数据可以对应多个标签,因此需要展开表,方便基于标签的SQL查询
@zhennann 牛逼,我研究一下
@yviscool 多谢,我学习一下