【问题标题】:Suggestions for my data structure/schema with Pouchdb - Couchdb对我的 Pouchdb 数据结构/模式的建议 - Couchdb
【发布时间】:2019-10-04 17:34:08
【问题描述】:

早上好!

我想为我目前正在处理的 pwa 使用 couchdb/pouchdb。

在我的项目中,我想存储“项目”,在“项目”中,我想存储项目标题和“章节”,在“章节”中,我想存储章节标题和“场景” ,一个“场景”包含包含文本。

哪种架构最有意义和性能最好?

现在我在想一个这样的计划:

  • 项目 1

    • 标题:字符串
    • 第一章

      • 场景1
        • 文本:字符串
      • 场景2
        • 文本:字符串
      • 场景3
        • 文本:字符串
    • 第 2 章

      • ...
  • 项目 2

    • 标题:字符串
    • 第一章

      • 场景一
      • ...

由于我只有 SQL 经验,以前从未使用过基于文档的数据库,我真的不知道如何放置一个有意义的结构。

我是在文档中存储文档以获得与上面完全相同的架构,还是为每个组件(项目、章节、场景)创建一个数据库?

【问题讨论】:

    标签: couchdb pouchdb


    【解决方案1】:

    您有多种选择。

    1. 每个项目都是一个包含章节列表的文档,每个章节都有一个场景列表。
    2. 项目、章节和场景是同一数据库中的三种不同类型的文档。

    哪一个最好取决于可能的总大小,以及这些组件中的每一个如何变化。 CouchDB 最适用于小型文档(千字节)。由于您只能更新整个文档,因此更改较大文档中列表或对象内部的位很快就会变得低效,并可能产生更新冲突。

    上面的第二个建议会更好地扩展,但是(目前;请参阅下面的链接)缺乏能够通过单个 API 调用提取有关项目的所有内容的便利。您可以使用 id 字段来获得很好的效果:

    {
        "_id": "project1:toplevel",
        "type": "project",
        "title": "Project 1"
    }
    
    {
        "_id": "project1:chapter1",
        "type": "chapter",
        "title": "Project 1, chapter 1"
    }
    
    {
        "_id": "project1:chapter1#scene1",
        "type": "scene",
        "title": "Project 1, chapter 1, scene 1"
    }
    

    在“即将登陆”的 CouchDB 版本中,此 id 格式可用于利用非常适合此处的所谓分区数据库。您可以在此处阅读有关它的博客文章:

    https://blog.cloudant.com/2019/03/05/Partition-Databases-Introduction.html

    【讨论】:

    • 感谢您的回答!在阅读您的答案+文章时,它点击了。但我有一个担忧,是否有一种本地方法可以获取项目中的所有章节?
    • 我做到了!我在打字时不小心回复了……你介意看看我编辑过的回复吗? :)
    • 如果您使用上面的 _id 格式,您应该能够使用带有合适的开始和结束键的 _all_docs,例如 startkey="project1:chapter"&endkey="project1:chapter/"
    • 这太完美了!而不得不使用多个 API 调用的反面,并没有真正影响到我,因为我在本地使用它并且只手动远程同步所有数据。感谢您花时间在我的问题上!
    • 很抱歉再次打扰您,我真的不明白在这种情况下如何使用开始和结束键。因为我真的不能排除东西。因此,当我尝试获取所有章节时,我无法从结果中排除场景。
    猜你喜欢
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-21
    • 2013-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多