我想建模一个方案,其中有一些项目,一些用户和一些标签。所以我有一个数据库,其中有三个表:User
,Tag
和Item
。
每个用户都可以为项目分配一些标签。只看Item
和Tag
之间的关系,我会说这是一种经典的多对多关系 - 每个Item
可以分配多个Tag
元素。到目前为止很明显。
现在有问题的部分是每个用户都可以使用自己的标签,它们可能与其他用户使用的相同或不同。在SQL中,我认为这可以使用每个Tag
的唯一slug建模,如果它存在则会被重用,如果不存在则会被创建。
现在这似乎是一个额外的多对多关系。每个Tag
可以由多个User
元素分配(针对多个项目)。但我如何有效地加入多对多关系呢?
最后我希望能够说出这样的话:
Tag1
,Tag2
被分配到Item1
Tag1
由User1
和User2
分享给Item1
但不是User3
Item1
由Tag1
用户N
如何将这个想法转化为SQL方案?
提前感谢任何想法。
答案 0 :(得分:1)
让我试着改写一下,看看我是否明白你在说什么。
因此,简而言之,标签到项目的分配是由某个用户完成的,可以看作是“私人”动作。
假设如下:
用户由uid识别
标签由tid
项目由iid识别。
然后由元组(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。我不是在这里编写超现代的生产证明代码,我正在设计一个数据模型。