我正在使用两个基本实体的推荐系统:用户和对象。将基于现有用户数据预先计算用户相似性度量。然后,当各种用户“标记”对象时,将向每个用户推荐对象(基于类似用户标记的内容)。
我是NoSQL的新手,并且不确定建模用户标志事件的最佳方式是什么,以及b)用户特定的建议。对我来说,两个选项显而易见:
1)“重量级”选项:将所有相关数据存储在主要对象中。 E.g:
UserA
FlaggedItems
FlaggedItemA
FlaggedItemB
FlaggedItemC
RecommendedItems
RecommendedItemA
RecommendedItemB
RecommendedItemC
或:
ItemA
FlaggedBy
UserA
UserC
UserR
RecommendedTo
UserB
UserD
UserX
2)“轻量级”选项:在粒度对象中存储“Flag”和“Recommendation”数据。 E.g:
FlagEvent
FlaggedBy
UserA
FlaggedItem
ItemA
DateTime
RecommendationEvent
RecommendationTo
UserC
RecommendedItem
ItemB
DateTime
我的假设是轻量级方法将更具可扩展性,因为用户/项目对象不会被不断修改,客户端同步将涉及获取用户特定的FlagEvents和RecommendationEvents,并且多个用户不可能尝试同时修改同一个对象。但我是CouchDB / noSQL的新手,欢迎来自更有经验的用户的想法。你会建议什么?
答案 0 :(得分:2)
通常,FlagEvent
和RecommendationEvent
系统最像典型的CouchDB模型。
根据建议,每个“事件”都有一个文档是整洁的,因为用户的大图建议摘要可能是这些事件的减少。 “这是你的最佳推荐。这里有一些你可能会喜欢的。”这样的事情。
通过添加,更改或删除单个“原子”推荐项,可以影响最终输出。
同样,拥有一个标志事件的方式也是一样的。通常,标志(或“喜欢”,或“+1”或其他)对于用户和项目是唯一的。因此,您可以使用_id
来存储类似username eventid
对的内容。然后就不可能标记两次,因为每个用户/项目组合都有1个且只有1个文档来表示该标志。为用户创建或删除标记/取消标记的文档。
显然,您最了解您的数据。但这些是我的第一个想法。当然,当有人说“推荐引擎”时,人们通常会立即想到“图形数据库”而不是“文档数据库” - 但我不知道任何基于开源图形数据库的高调推荐引擎(还是)。