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

使用场景描述:

我们公司内部的一个系统,员工每次创建一个记录,可以给这个记录加标签。其中,有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-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开源全栈框架提供的用户标签的设计,跟你描述的场景是一致的,可以参考一下:

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

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

@zhennann 牛逼,我研究一下

@yviscool 多谢,我学习一下

回到顶部