请大神帮帮忙,看看怎么设计这样的数据库?类似Github的标签功能。 - CNode技术社区

请大神帮帮忙,看看怎么设计这样的数据库?类似Github的标签功能。
发布于 3 年前 作者 hz0324 3914 次浏览 来自 问答

使用场景描述:

我们公司内部的一个系统,员工每次创建一个记录,可以给这个记录加标签。其中,有5个标签是固定的,提前设置好的,员工可以改掉它们,还可以添加自定义的标签。这个标签只有他自己能看到。我觉得这个功能需求跟Github的issue中提供的标签系统很像,但是不知道怎么设计数据库结构。

请问,这个场景下,使用MySQL数据库该怎么设计表结构啊?如果有必要,我们可以使用Redis。

请各位大神帮帮忙。

4 回复

我问了一下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月01日T08:00:00.000Z',
 updated_at: '2022年10月01日T08: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月01日T08:00:00.000Z',
 updated_at: '2022年10月01日T08: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开源全栈框架提供的用户标签的设计,跟你描述的场景是一致的,可以参考一下:

  1. 便捷的数据管理:用户星标、红橘双色提示
  2. 再议红橘双色提示
  3. 创建一个CabloyJS项目,就可以通过Mysql看到完整的数据表设计,分别是:

aLabel:用户标签表 aAtom:数据表 aAtomLabel:数据与标签关联表 aAtomLabelRef:数据与标签关联展开表。因为一条数据可以对应多个标签,因此需要展开表,方便基于标签的SQL查询

@zhennann 牛逼,我研究一下

@yviscool 多谢,我学习一下

回到顶部

AltStyle によって変換されたページ (->オリジナル) /