为项目关联地分配用户投票的标签

时间:2019-04-08 06:24:38

标签: mysql relationship rdbms

我正在创建一个包含数千个项目的网站。除其他事项外,用户可以投票将标签分配给具有以下逻辑的商品:

  1. 用户可以为每个项目投票任意数量的标签。
  2. 这些物品可以具有任意数量的标签。
  3. 任何项目都会获得标签[the number of votes for that tag] ≥ 0.5 * [the number of votes for the most voted tag](在问题内)的位置。
  4. 用户可以查看和更改项目的投票-因此,我需要保存实际投票。

我是SQL的新手,我想知道如何用标签最好地填充项目。

我希望双方都可以访问该关系。也就是说,我希望能够获得所有tags的所有item和所有items的所有tag的。

技术堆栈为:

  • DB:运行v。8的MySQL服务器(可以切换到例如Postgres)
  • API:运行带有Objection.js作为ORM的Express的节点应用程序(但我想这个问题与API无关)。

我可以看到两种主要的实现方法:

解决方案1 ​​:在查询项目或标签时,对投票进行计数和分组,然后选择符合上述第3点条件的投票。

解决方案2 :当用户投票时,进行相同的计算并将标记保存在联结表中。

据我所知,数据库的MWE设置包含以下4个表:

user TABLE
- id
- (...)


question TABLE
- id
- (...)


tag TABLE
- id
- (...)

votes TABLE
- user_id
- question_id
- tag_id

如果选择了解决方案2,则会添加第5个表:

question_tag TABLE
- question_id
- tag_id

在开发过程中,我设法使两个设置都能正常工作。

对于解决方案1,我喜欢没有数据冗余。但是,这种关系不太直接定义,并且查询“其他”数据有点混乱-两种方法都必须如此。

对于解决方案2,我(基本上)将相同的数据存储两次。但是,关系查询要简单得多,而且性能可能更高(我希望对项目和标签的查看都比对投票要简单得多)。

因此,从本质上讲,我的问题可以归结为:哪种方法被认为是更好的做法-并且有更好的方法来实现这一目标吗?

谢谢!

0 个答案:

没有答案