gpt4 book ai didi

mysql - 如何设计关联多个标签id的关系型数据库?

转载 作者:行者123 更新时间:2023-11-29 07:37:57 26 4
gpt4 key购买 nike

我正在开发一个问答网站项目,该网站中的一个问题可以链接多个标签。

例如:如何在 C++ 中实现快速排序?

这道题的标签可以是C, C++, Algorithm

我的问题是如何将这些标签存储在 MySQL 表中?

我的方法:

上面的问题有id = 123

-------------------------
|question_id | tags |
-------------------------
| 123 | C |
-------------------------
| 123 | C++ |
-------------------------
| 123 |Algorithm |
-------------------------
| 124 | Java |
-------------------------

但是如果我在这个意义上创建一个表,那么对于很多问题,这个表会变得非常大。

有没有更好更有效的方法来存储这种数据?

最佳答案

在信息系统中管理标签可以通过两种方法来完成。我们在简单和低性能复杂和困难和高性能之间权衡

第一个解决方案:使用 TAG 表以及 Our_Table 和 TAG 表之间的多对多关系。 (如@tadman 所述)

第二种解决方案:如果我们想要一种非常快速和高性能的方法来检索与特定标签相关的数据,我们可以使用Bit-Mask Solution

标签管理系统的位掩码解决方案(之前针对类似问题描述过here)

在这种方法中我们有相同的表(如@tadman 所说)。只需将 1 个字段,longbigint(与我们的 DBMS 相关)添加到想要具有 TAG 的表中(如 Question)

此字段以二进制格式显示问题的标签。例如假设我们在 TAG 表中有 8 条记录。
1- 一些 TAG 1
2- 一些标签 2
...
8- 一些标签 8

然后如果我们想将 TAG 1、3、6、7 设置为一个问题,只需使用这个数字 01100101。
(我建议使用反转版本的二进制 (0, 1) 放置以支持将来的其他 TAG。)

我们可以使用10个基数添加到数据库中(101而不是01100101)

然后,要为任何给定的标签找到合适的问题,只需从问题中选择并使用按位与 如下所示。


A:(显示我们在问题中查找的 TAG 序列,如 5 为 00000101)
B:(将任何问题的标签显示为 01100101,如 101)

select * from Question q
where A & q.B = q.B

此查询返回所有具有特定标签子集的问题。

我们可以使用位运算的其他功能,例如 A & q.B > 0AB 之间返回至少 1 个相等的 TAG >。等等。

注意:
1:当添加或删除新的标签时,我们有一些额外的困难。但这是一个权衡。添加或删除新标签的情况较少。
2:我们也应该使用QuestionTagsQuestion_Tags表。但是在搜索中,我们只是使用新字段。

关于mysql - 如何设计关联多个标签id的关系型数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47881198/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com