gpt4 book ai didi

javascript - PouchDb/CouchDb 中的递归删除?

转载 作者:行者123 更新时间:2023-12-02 14:53:31 25 4
gpt4 key购买 nike

我正在使用 PouchDB 同步到 cloudant 上的 CouchDB 来实现一个应用程序。我有一个递归的类别层次结构。

服装

  • 上衣

    • 衬衫
      • T 恤
      • 正装衬衫
    • 夹克
      • 轰炸机
      • 摩托车
  • 下装

    • 裤子
    • 短裤

我存储它的方式是使用“类别”类型,每个类别都有一个“parentId” - 没有父节点的节点是根节点。这样,我猜父级就充当了一种外键。

首先,我不知道这是否是正确的存储方式,但它似乎在我的应用程序中工作得很好。问题是当我想删除时该怎么办?例如,如果我想删除“Tops” - 我必须递归地遍历树并对每个项目执行删除?这真的是正确的方法吗?好像有了sync,就会很“啰嗦”在上面的例子中,我最终不得不触发 3 次查询和 4 次删除??

请赐教

最佳答案

您似乎已经将关系数据模型映射到文档存储中。

除非有充分的理由不这样做,否则我建议您使用一个“库存”文档,其中存储您正在谈论的所有信息?那么你所说的删除将是这样的:

db.get('inventory').then(function(doc) {
delete doc.tops
return db.put(doc);
}).then...etc

OP 评论后更新

大多数人都会这样做,他们以一种非常理性数据库<​​/em>的心态来处理文档存储。我建议两种不同的心态转变:

  1. 将文档存储想象成更像是获取程序在 RAM 中的对象,然后将它们按原样保存到磁盘。
  2. 让您的默认为“我所有数据的一个文档”,并且只有在有理由的情况下才创建一个单独的文档。

创建多个文档可能还有其他原因,但对我来说,两个主要原因是:

  1. 唯一性:文档的 _id 是 CouchDB 中唯一可以为您提供系统范围(或实际上是数据库范围)机制/检查/约束的东西。因此,像用户这样具有唯一用户名的东西,我会放入他们自己的文档中。
  2. 避免冲突:如果您有多个客户端更新相同的数据,例如。客户订单进入您的系统,尤其是多个节点都相互复制。将事情分开,这样就不会在同一个文档上发生并发写入,这会让您的生活变得更加轻松。

除了这些原因之外,我建议将所有内容保留在一个文档中,然后创建有意义的 View ,以便您可以获得所需的数据。

对于您的具体后续问题:

are you saying to have 1 doc to host the full tree?

是的,正如我上面所说,我建议使用一个“库存”文档

is that a common way to store this type of data?

我不知道有多常见/不常见,我知道很多人都会犯你所犯的错误,并以关系心态来处理文档存储,所以这可能很常见。但这不是一个好方法,并且会导致许多麻烦,因为文档存储不具有与 RDBMS 相同的功能,例如。缺少多个文档更新的事务。

are there any downsides to this approach?

除了我上面提到的独特性和冲突之外,没有。

if I have "shirt 1", i want it to belong to tops/shirts/t-shirts so some sort of ID is necessary

考虑一下如何在 RAM 中执行此操作。

例如。您可能会使用以下文档结构,而不是您想要的结构:

{
"_id": "inventory",
"skus": {
"123456": {
"sku": "123456",
"name": "Purple T-Shirt",
"tags": [ "top", "t-shirt", "shirt", "purple" ]
},

# ...
}

然后在 View 中您将按标签生成数据查找,例如:

function(doc) {
if(doc._id == "inventory") {
for(var sku in doc.skus) {
var item = doc.skus[sku]
item.tags.forEach( function(tag) { emit( tag, sku ) })
}
}
}

因此,您可以使用该 View 查找所需的任何 sku,然后使用:doc.items[sku] 来检索它。或者,如果您愿意在索引中包含该数据,则可以将该项目放入 emit 输出中。

关于javascript - PouchDb/CouchDb 中的递归删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36002964/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com