我有以下实体:
对于包含用户列表的每个子类别,我使用了单独的文件。Redis server有键-值对,如
<userId_InterestId:games,programming>然而,这种设计有许多限制,比如由于磁盘操作而导致访问时间较慢,以获得给定类别的所有用户。Redis中的大量密钥,即用户数量(sub_categories的数量)。
当前的计划是使用MongoDb来维护用户<->类别映射的层次数据。
<User_id, Interests, A, B, C>.每个类别都有子字段。因为MongoDB是内存中的DB访问,所以使用user_id应该更快,对吗?但是反向查询如何,我将兴趣::编程指定为关键呢?有什么更好的设计方法吗?
发布于 2015-07-23 11:31:09
下面是我要做的:不区分类别和子类别。每个类别都有与其相关联的父类别,可能为null (类别而不是子类别)。
如果我正确理解,类别不是用户的子类,所以如果用户被删除,它就不会删除它的类别。在这种情况下,您将需要一个名为UserCategories的子用户表,该表将用户id与特定类别关联起来。
所以现在,如果您想查找用户的所有类别,那么您就有了一个子表,它为您提供了这些信息。相反,如果您有一个类别,您可以找到所有与其id相关的用户给定的UserCategories。通过消除子类别通过类别的需要,您已经将用户直接链接到子类别,从而使管理变得更加容易。
显然,在您的程序中,您可以将一个具有父类的类别作为“子类别”来处理,并对它进行不同的处理,但是在数据库中,它只意味着一个具有父类别的类别。
发布于 2015-07-30 13:35:46
如果有一个更简单的类别结构,如线性列表,就几乎不会有一个如何做到这一点的问题。你只需要有一张用户标识的地图:cat-id。
现在,由于类别列表是一棵树,而不是线性映射,所以它并没有那么糟糕!理想情况下,您应该创建一个哈希映射,它可以线性化每个叶节点的完全分层表示。
举个简单的例子
现在很容易看到,MxN关系可以设置为user_id - HASH_VALX列表。
发布于 2015-07-23 11:50:18
MongoDB将允许您在Interests上创建索引。当您为包含数组的字段创建索引时,每个数组条目都会得到一个单独的索引条目。因此,当您的文档看起来像这样:
{
_id:<<Objectid>>
interests: [
"Programming",
"Knitting",
"Paragliding"
]
}像db.collection.find({interests:"Programming"})这样的查询将为您提供兴趣数组有一个条目"Programming"的所有文档,并将受益于interests上的索引。
https://softwareengineering.stackexchange.com/questions/290582
复制相似问题