请教一下,标签系统中数据库表结构设计的问题

2020-06-21 21:55:42 +08:00
 watanuki

需求:

从一个网站爬虫爬取文件的标签,并允许用户创建标签&为文件重新编辑标签,不同用户在同一文件上编辑的标签是独立的(即我为一个文件添加的标签只有我自己能看到,其它用户看不到)。 爬虫得到的标签是一个对象,{ "id": 123, "name": "xxx" } 文件的元数据存储在 t_work (id, name, ...) 文件与标签是多对多关系,存储在 r_work_tag (work_id, tag_id) 为了不覆盖原始的标签关系,用户重新编辑的标签存储在 r_work_user_tag (work_id, user_id, tag_id)

我想保留标签的原始 id,并将其设为表 t_tag 的主键

问题:

我该怎样建表?我该不该把用户创建的标签单独存放到一个表里(t_user_tag)? 这个问题我也想过几种解决方法,但哪种方案才是最合理的?这让我很纠结。 大家在遇到这种需求时,一般是怎样建表的呢?

  1. 如果要把用户创建的标签原始标签存放在一张表里,怎么解决主键 id 的冲突? 1.1. 通过预留一定数量的间隔来解决?(比如,前 999 个位置给原始标签,用户标签从第 1000 个开始写入) 1.2. 放弃使用原始标签的 id 作为主键,单独开一列(original_id)以存放原始标签的 id

  2. 如果用户创建的标签原始标签分两个表(t_usertag & t_originaltag)存放,又该如何引用外键?(一个文件的有多个标签,可能同时包含原始标签和用户标签) 2.1. 把用户重新编辑的标签存储在两个表里(r_work_user_usertag & r_work_user_originaltag),分别从各自对应的标签表里(t_usertag & t_originaltag)引用外键?

2354 次点击
所在节点    MySQL
5 条回复
summerwar
2020-06-22 05:43:45 +08:00
标签里 status 就是,1 启用,0 弃用
watanuki
2020-06-22 15:06:40 +08:00
@summerwar #1 用二进制?
shellus
2020-06-22 15:26:09 +08:00
1:用户创建的标签 和 原始标签 相差就是有没有 user_id 而已,可以放在同一个表
2:这种记录映射关系的表,不要自增主键也可以,不存在主键冲突问题
3:如果建两个表来存原始和用户标签,不用考虑外键,外键是干嘛的?能吃吗?
summerwar
2020-06-22 23:08:51 +08:00
跟二进制有啥关系 就是用 int 表示状态而已
fhsan
2020-06-24 16:20:17 +08:00
让我想起来二进制,银行 A=0,银行 B=1,银行 C=2,银行 D=4,不重复的任意组合,二进制就能求的谁和谁组合

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/683562

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX