我认为所有这三种 NoSQL 技术在标签都直接包含在帖子记录中的非规范化模型中会表现得更好。问题是您想跟踪创建标签的时间,这比标签更烦人,但您仍然可以这样做。您可以拥有您描述的标签集合,然后在将标签添加到帖子时复制创建的时间。如果您希望能够从系统中删除标签,它会变得更加复杂。
在 mongodb(我最有经验的那个)中,你可以这样做:
帖子集合示例:
{
_id: ...,
title: "test title",
body: "body",
tags: [
{
title: "test tag",
created: ISODate("2012-08-05T02:45:40.575Z")
},
{
title: "test tag2",
created: ISODate("2012-08-05T02:47:37.124Z")
}
]
}
那么您的查询将类似于:
db.posts.find({"tags.created":{$gt:new Date("2012/08/05")}});
并且有一个索引tags.created
会加快速度。
TL;DR:在大多数 NoSQL 技术中尝试使用连接表确实没有性能。
从 neo4j 的角度更新以添加一点:
在我看来,您可以在 neo4j 中相对轻松地关联标签和帖子(没有连接表,因为关系实际上是永久连接)。您将搜索不到 2012/08/05,然后找到与这些标签相关的帖子。不需要非规范化。从理论上讲,这是高效的,尽管我还不是 neo4j 专家。在 Cypher 中它看起来像这样:
START post=node(*)
MATCH post<-[:tagged]-tag
WHERE tag.created < "2012-08-05"
RETURN post, tag;
您可以通过索引created
并使 START 与索引匹配来加快此查询,而不是使用 WHERE。在本例中,我创建了created
一个 ISO 日期字符串,关系类型为tagged
.