我有一个应用程序,其中文章可以链接到多个平台

文章包含平台列表,平台也包含文章列表。

有关更多详细信息,请查看我几个月前问的这个stackoverflow问题。

https://stackoverflow.com/a/40377383/5770147

问题是如何创建文章以及如何实现文章与平台之间的N-N关系。

我有“创建文章”和“删除文章设置”,以便列表也在平台中更新。

如何实现编辑文章,以便可以更新链接到文章的平台?

为了创建和编辑链接的平台,我使用一个下拉菜单,可以在其中选择多个选项。可以在先前链接的问题中找到必要的代码。

最佳答案

根据您提供的信息,我将建议从相同的基础开始的两种可能的方法:



如果出现以下情况,我将推荐这种方法:

  • 您的文章文档和主题文档都具有很高的基数
    平台
  • 您希望能够独立管理两个实体,而
    还在它们之间同步引用
    // articles collection schema
    {
    "_id": ...,
    "title": "I am an article",
    
    ...
    
    "platforms": [ "platform_1", "platform_2", "platform_3" ],
    ...
    }
    
    
    // platforms collection schema
    {
    "_id": "platform_1",
    "name": "Platform 1",
    "url": "http://right/here",
    ...
    },
    
    {
    "_id": "platform_2",
    "name": "Platform 2",
    "url": "http://right/here",
    ...
    },
    
    {
    "_id": "platform_3",
    "name": "Platform 3",
    "url": "http://right/here",
    ...
    }
    

  • 即使这种方法非常灵活,也要付出一定的代价-如果您同时需要商品数据和平台数据,则由于数据被分为两个不同的集合,因此您将不得不向MongoDB实例发起更多查询。

    例如,在加载文章页面时,考虑到您还希望显示platforms列表,则必须对articles collection发起查询,然后触发platforms collection的搜索以检索该平台所针对的所有平台实体文章是通过platformarticle document s数组的成员发布的。

    但是,如果只有很少一部分经常访问的platform attributes子集,而在加载article document时需要具备该子集,则可以增强platforms上的articles collection数组,以存储这些属性,以及对平台文档的_id引用:
    // enhanced articles collection schema
    {
    "_id": ...,
    "title": "I am an article",
    
    ...
    
    "platforms": [
        {platform_id: "platform_1", name: "Platform 1"},
        {platform_id: "platform_2", name: "Platform 2"},
        {platform_id: "platform_3", name: "Platform 3"}
    ],
    
    ...
    

    }

    如果您经常检索以与商品特定数据一起显示的platform data attributes的更改不那么频繁,则此混合方法将是合适的。

    否则,您将必须将对platform document attributes中的platforms collection进行的所有更新与您作为文章文档的platform数组的一部分跟踪的属性子集进行同步。

    关于各个平台的文章列表的管理,我不建议在两个集合中存储N对N引用,因为上述机制已经允许您通过使用articles collection值为的查找查询来查询_id来提取文章列表。 platform document:
    Approach #1
    db.articles.find({"platforms": "platform_1"});
    
    Approach #2:
    db.articles.find({"platforms.platform_id": "platform_1"});
    

    介绍了两种不同的方法后,我现在建议您分析应用程序的查询模式和性能阈值,并根据遇到的方案做出决策。

    关于mongodb - 在mongodb中编辑子文档N-N关系,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42139856/

    10-16 07:38