2

我正在使用两个基本实体开发推荐系统:用户和对象。用户相似度指标将根据现有用户数据预先计算。然后,随着各种用户“标记”对象,对象将被推荐给每个用户(基于相似用户标记的内容)。

我是 NoSQL 新手,不确定建模 a) 用户标志事件和 b) 用户特定建议的最佳方法。两个选项对我来说似乎很明显:

1)“重量级”选项:将所有相关数据存储在主要对象中。例如:

UserA
    FlaggedItems
        FlaggedItemA
        FlaggedItemB
        FlaggedItemC
    RecommendedItems
        RecommendedItemA
        RecommendedItemB
        RecommendedItemC

或者:

ItemA
    FlaggedBy
        UserA
        UserC
        UserR
    RecommendedTo
        UserB
        UserD
        UserX

2)“轻量级”选项:将“标志”和“推荐”数据存储在粒度对象中。例如:

FlagEvent
    FlaggedBy
        UserA
    FlaggedItem
        ItemA
    DateTime

RecommendationEvent
    RecommendationTo
        UserC
    RecommendedItem
        ItemB
    DateTime

我的假设是轻量级方法将更具可扩展性,因为不会不断修改用户/项目对象,客户端同步将涉及获取用户特定的标志事件和推荐事件,并且不会有多个用户尝试修改相同的同时对象。但我是 CouchDB/noSQL 的新手,欢迎更有经验的用户提出想法。你有什么建议?

4

1 回答 1

2

一般来说,FlagEventandRecommendationEvent系统最像典型的 CouchDB 模型。

有了推荐,每个“事件”都有一个文档是整洁的,因为用户的大图推荐摘要可能是这些事件的减少。“这是你最推荐的。还有一些你可能喜欢的。” 类似的东西。

通过添加、更改或删除单个“原子”推荐项目,您可以影响最终输出。

同样,拥有标志事件的工作方式相同。通常,标志(或“喜欢”或“+1”或其他)对于用户和项目是唯一的。因此,您可以使用_id来存储类似username eventid对的东西。然后不可能标记两次,因为每个用户/项目组合都有 1 个且只有 1 个文档来表示该标志。创建或删除文档以标记/取消标记用户。

显然,您最了解自己的数据。但这是我最初的想法。当然,当有人说“推荐引擎”时,人们通常会立即想到“图数据库”而不是“文档数据库”——但我不知道有任何基于开源图数据库的高调推荐引擎(目前)。

于 2011-04-04T05:05:16.217 回答