小编Ant*_*WDG的帖子

如何在Doctrine MongoDB ODM中正确处理非规范化数据同步

使用MongoDB时,引用数据的非规范化似乎是一种非常常见的做法.然而,我没有看到使用Doctrine MongoDB ODM处理它的任何内置方法.

假设我有一个社交网络,用户可以互相关注,这里有两个示例用户:

{
  _id : id1,
  name: "Malcolm Reynolds",
  followed: []
}

{
  _id : id2,
  name: "Zoe Alleyne",
  followed: [
    { _id: id1, name: "Malcolm Reynolds" }
  ]
}
Run Code Online (Sandbox Code Playgroud)

如您所见,我希望'name'属性被非规范化.正如我所说,Doctrine ODM似乎没有内置的方法来做到这一点.由于关于这个问题的最新一期是一年,我会尝试自己做.

虽然我在互联网上发现了很多文章,解释了非规范化在什么情况下是有用的,并提到如何保持非规范化数据的一致性,但我没有找到解释如何实现真正的数据更新过程.

在我的情况下,最终一致的数据就足够了,用户名更新和非规范化数据更新之间可能会有几个小时.我可以看到3种不同的方法:

1 - 一致性检查程序:让 后台运行的任务定期更新非规范化数据.

2 - 更新触发器: 名称字段上的每次更新都会在单次刷新中更新所有关联的非规范化数据.

3 - 混合解决方案 对于每个用户,当更新名称时,会将一个条目添加到具有更新信息的队列中(用户更新和队列中的插入将在单个刷新中进行),并且运行任务后台做了实际的更新.

第一个解决方案似乎是最容易实现的,但正如我所看到的那样,它可能非常耗费资源.第二种解决方案会使更新请求变得非常长,即使读/写比率很高,我也可能会遇到这个问题.我认为第三种解决方案是要走的路,我这样认为是对的吗?

另外,我想以干燥的方式进行,例如,我希望不必在preUpdate回调中为每个数据非规范化的Document重写相同的代码.我正在考虑制作自定义注释,这是一个好主意吗?

denormalization mongodb doctrine-odm doctrine-mongodb

15
推荐指数
0
解决办法
522
查看次数

使用指针值类型将unordered_map上的迭代器转换为具有const引用值类型的同一映射上的迭代器

我有以下课程:

#include <unordered_map>
#include <memory>


class Node {
public:
    typedef std::unique_ptr<Node> ptr_type;
    typedef std::unordered_map<char, ptr_type> map_type;

    typedef /**???**/ const_iterator;

    const_iterator begin() const;
    const_iterator end() const;

private:
    map_type _children;
};
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我想要一种方法让这个类的用户迭代元素_children而不能修改它们.这就是为什么我想创建一个指向类型元素的迭代器pair<char, const Node&>而不是pair<char, ptr_type>.

创建一个基础迭代器类对于手头的任务来说似乎有点过于复杂.我已经看过boost迭代器,我想transform_iterator可能是要走的路,但我还没有找到如何让它工作.

虽然我在这里,有谁知道我在哪里可以找到定义的迭代器的不同示例的示例boost-iterators?每个类型的文档中只有一个示例,它们并不总是符合我的需求(我是这个库的新手,我可能错过了一些明显的东西).

更新:这是我尝试使用boost::transform_iterator

class Node {
public:
    typedef std::unique_ptr<Node> ptr_type;
    typedef std::unordered_map<char, ptr_type> map_type;


    struct Transformer {
        std::pair<char, const Node&> operator()(const std::pair<char, ptr_type> &p) const {
            return std::pair<char, const Node&>(p.first, *p.second);
        }
    };

    typedef boost::transform_iterator<Transformer, …
Run Code Online (Sandbox Code Playgroud)

c++ boost-iterators

5
推荐指数
1
解决办法
904
查看次数