如何设计一个关系数据库,用于将多个标签与id相关联?

时间:2017-12-19 06:31:07

标签: mysql database-design relational-database

我正在开发一个Q / A网站项目,本网站的问题可以与多个标签链接。

例如:How can I implement quicksort in C++ ?

此问题的标签可以是C, C++, Algorithm

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

我的方法:

上述问题有id = 123

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

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

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

3 个答案:

答案 0 :(得分:1)

有一个额外的表格,正好有3列:标记项目的标识,标记,订购信息。

当您添加或删除项目时,请添加或删除此表格中的所有相关行。

详细信息如下:http://mysql.rjweb.org/doc.php/lists
高效,快速,简便,高度可扩展。

答案 1 :(得分:0)

为了使您的代码保持紧凑,请将代码本身设为第一类实体,而不仅仅是一些随机字符串列:

CREATE TABLE tags (
  id INT PRIMARY KEY AUTO_INCREMENT NOT NULL,
  label VARCHAR(255) NOT NULL,
  UNIQUE KEY `index_on_label` (label)
);

然后在问题和标签之间有一个小而简单的连接表:

CREATE TABLE question_tags (
  question_id INT NOT NULL,
  tag_id INT NOT NULL,
  UNIQUE KEY `index_on_question_tag` (question_id, tag_id),
  KEY `index_on_tag` (tag_id)
);

这应该包括查询问题的标签和标签的问题。

答案 2 :(得分:0)

在信息系统中管理标签可以通过两种方法完成。我们在简单性和低性能复杂性和困难以及高性能之间进行了“强烈的权衡”。

第一个解决方案:使用TAG表和Our_Table与TAG表之间的多对多关系。 (正如@tadman描述的那样)

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

TAG管理系统的位掩码解决方案(之前针对类似问题here进行了描述)

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

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

然后如果我们想将TAG 1,3,6,7设置为一个Question,只需使用此号码01100101.
(我提议使用反向版本的二进制(0,1)放置将来支持额外的TAG。)

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

然后,要为任何给定的TAG找到合适的Question,请从Question中选择并使用bitwise AND,如下所示。


A:(显示我们正在查询的TAG序列,如5,为00000101)
B:(显示任意Question的标签,如101,为01100101)

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

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

我们可以使用像A & q.B > 0这样的Bit-Wise操作的其他功能在AB之间返回至少1个相等的TAG。等等。

<强>注意:
1:添加新TAG或删除时,我们有一些额外困难。但这是一种权衡。添加或删除新TAG较少发生。
2:我们也应该使用QuestionTagsQuestion_Tags表。但在搜索中,我们只是使用新的领域。