将多个多对多关系相互连接

时间:2014-08-13 08:07:50

标签: sql database

我想建模一个方案,其中有一些项目,一些用户和一些标签。所以我有一个数据库,其中有三个表:UserTagItem

每个用户都可以为项目分配一些标签。只看ItemTag之间的关系,我会说这是一种经典的多对多关系 - 每个Item可以分配多个Tag元素。到目前为止很明显。

现在有问题的部分是每个用户都可以使用自己的标签,它们可能与其他用户使用的相同或不同。在SQL中,我认为这可以使用每个Tag的唯一slug建模,如果它存在则会被重用,如果不存在则会被创建。

现在这似乎是一个额外的多对多关系。每个Tag可以由多个User元素分配(针对多个项目)。但我如何有效地加入多对多关系呢?

最后我希望能够说出这样的话:

  • Tag1Tag2被分配到Item1
  • Tag1User1User2分享给Item1但不是User3
  • Item1Tag1用户
  • 标记为N

如何将这个想法转化为SQL方案?

提前感谢任何想法。

1 个答案:

答案 0 :(得分:1)

让我试着改写一下,看看我是否明白你在说什么。

  1. 项目与标签之间存在多对多关系。这意味着,每个项目都可以有多个标签。每个标记都可以是多个项目的标记。
  2. 用户将标签分配给商品。这也是多对多,因为任何用户都可以分配多个标签,并且任何标签都可以由多个用户分配。
  3. 因此,简而言之,标签到项目的分配是由某个用户完成的,可以看作是“私人”动作。

    假设如下:

    1. 用户由uid识别

    2. 标签由tid

    3. 标识
    4. 项目由iid识别。

    5. 然后由元组(tid,iid,uid)描述由某个用户为项目分配标记的动作。这也描述了表格,我称之为T,你需要。

      现在回答你想要回答的问题(改变了最复杂问题的顺序):

      一个。 Tag1,Tag2分配给item1

      select distinct tid
      from T
      where iid = 'Item1';

      湾Item1由N个用户标记为Tag1

      select count(*) from T where iid = 'Item1' and tid = 'Tag1';

      ℃。 Tag1由User1和User2共享为Item1而不是User3我将不得不重新解释这个问题,因为不清楚如何将答案放入(关系)表中,假设您有任意数量的标签,用户,项目。所以我假设User3的Tag1没有被User3共享的信息足以作为答案(获得补充集是一个简单的练习)。

      select uid
      from users
      where uid not in ( select uid from T where tid = 'Tag1' and iid = 'Item1' );

      在人们开始抱怨之前,这种类型的选择陈述是老式的,而不是那种做法。它提供了所需的答案,足以满足POC。我不是在这里编写超现代的生产证明代码,我正在设计一个数据模型。