【问题标题】:Multiple entries in a single row in a single column postgres单列中的单行中的多个条目 postgres
【发布时间】:2017-09-06 17:20:22
【问题描述】:

我的数据库中的表有问题。例如,如果我正在构建一个博客,我博客上的一篇文章应该有多个标签。我曾想过在我的帖子表中有一个tag_id 列,对应于我的tags 表中的tag_id,但这意味着每个帖子只能有一个标签。我希望每个帖子都能够有多个标签。如何在我的tag_id 列的单行中输入多个 ID(对应于特定帖子)。如果它不能与 id 一起使用,它可以与标签名称一起使用吗?我意识到我可以输入多个标签名称,但是如何将标签名称与tags 表中的tags_names 连接起来?

【问题讨论】:

标签: javascript node.js postgresql knex.js


【解决方案1】:

参考我几年前写的文章Implementation for tag based mail system by JOINS using MySQL Database,我想说你做的是对的。所以最终,你的表格应该是这样的:

帖子

mysql> SELECT * FROM `mailserver`.`mails`;  
+----+------------------+----------------------------------------------+
| ID | Subject          | Content                                      |
+----+------------------+----------------------------------------------+
|  1 | Welcome Home     | Hey man, Welcome to your new house.          |
|  2 | Hi               | Hey there, wanna see what you doing at home! |
|  3 | Your promotion   | This is to say about your promotion!         |
|  4 | What the hell?   | College is really bad!                       |
|  5 | My Project Work! | I have hereby attached my project work!      |
+----+------------------+----------------------------------------------+
5 rows in set (0.00 sec)  

标签:

mysql> SELECT * FROM `mailserver`.`maillabel`;  
+----+-----------+--------+
| ID | LabelName | MailID |
+----+-----------+--------+
|  1 | inbox     |      1 |
|  2 | inbox     |      3 |
|  3 | inbox     |      5 |
|  4 | personal  |      1 |
|  5 | friends   |      2 |
|  6 | office    |      3 |
|  7 | personal  |      4 |
|  8 | college   |      5 |
+----+-----------+--------+
8 rows in set (0.02 sec)  

关系表

mysql> SELECT * FROM `mailserver`.`maillabel`;  
+----+-----------+--------+
| ID | LabelName | MailID |
+----+-----------+--------+
|  1 | inbox     |      1 |
|  2 | inbox     |      3 |
|  3 | inbox     |      5 |
|  4 | personal  |      1 |
|  5 | friends   |      2 |
|  6 | office    |      3 |
|  7 | personal  |      4 |
|  8 | college   |      5 |
+----+-----------+--------+
8 rows in set (0.02 sec)  

最终,你会对两件事感兴趣。

  1. 如何从一个特定标签获取帖子?
  2. 如何获取特定帖子的所有标签?

回答上述问题:

特定标签inbox的所有帖子:

mysql> SELECT *  
       FROM   `mailserver`.`mails`
              JOIN `mailserver`.`maillabel`
                ON `mailserver`.`mails`.`id` = `mailserver`.`maillabel`.`mailid`
       WHERE  `mailserver`.`maillabel`.`labelname` = 'inbox'; 
+----+------------------+-----------------------------------------+----+-----------+--------+
| ID | Subject          | Content                                 | ID | LabelName | MailID |
+----+------------------+-----------------------------------------+----+-----------+--------+
|  1 | Welcome Home     | Hey man, Welcome to your new house.     |  1 | inbox     |      1 |
|  3 | Your promotion   | This is to say about your promotion!    |  2 | inbox     |      3 |
|  5 | My Project Work! | I have hereby attached my project work! |  3 | inbox     |      5 |
+----+------------------+-----------------------------------------+----+-----------+--------+
3 rows in set (0.00 sec)  

然后回答第二个问题……

获取特定帖子的标签:

mysql> SELECT labelname  
       FROM   `mailserver`.`maillabel`
              JOIN `mailserver`.`mails`
                ON `mailserver`.`mails`.`id` = `mailserver`.`maillabel`.`mailid`
       WHERE  `mailserver`.`mails`.`id` = 3; 
+-----------+
| labelname |
+-----------+
| inbox     |
| office    |
+-----------+
2 rows in set (0.00 sec)  

此实现适用于 MySQL Server 5.x。这个概念可以应用于 Oracle、Microsoft SQL Server、IBM DB2 等。甚至我们可以将其应用于 MS Access。只是查询的语法在每个数据库中有所不同。

【讨论】:

  • 在我的tags 表中添加一个非唯一的post_id 应该会成功!非常感谢!!!
猜你喜欢
  • 1970-01-01
  • 2020-01-25
  • 1970-01-01
  • 2016-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-13
  • 1970-01-01
相关资源
最近更新 更多