Redux store - 数据库 - 如何传播变化

Redux store - Database - how to propagate changes

在我的 angular4 应用程序中,我有 2 个列表: "list of my friends" 和 "list of xys friends"

我将这两个列表都添加到了商店中,因为我将它们显示在不同的组件中,并且我希望所有不同的组件能够立即实现列表上的更改。

如果一个朋友现在改变它 "name" 我有一个问题,我必须在 2 点更新商店。在 "list of my friends" 和 "list of xys friends" 中。这感觉是错误的,令人困惑的,而且很难跟踪。

另一种方法是先更新数据库中的"name",然后重新请求"list of my friends" 和"list of xys friends" 的新版本。

但这需要很多时间,尤其是当我有更多列表时。

那么专业的做法是什么?非常感谢!

这就是为什么建议保持数据存储(尤其是 Redux 存储)平坦的确切原因。通常,应该有最少的嵌套,实体应该通过它们的 id 相互引用。

最好用一个例子来解释。目前,您的数据可能如下所示:

{
    allUsers: [
        {
            id: 1,
            name: 'Foo',
            friends: [
                {
                    id: 2,
                    name: 'Bar',
                },
                {
                    id: 3,
                    name: 'Baz'
                }
            ]
        },
        {
            id: 2,
            name: 'Bar',
            friends: [
                {
                    id: 3,
                    name: 'Baz'
                }
            ]
        },
        {
            id: 3,
            name: 'Baz',
            friends: []
        }
    ]
}

如您所见,有很多嵌套和重复。如果任何用户更改了他们的名字,将此更改传播到整个商店将很困难,尤其是在更复杂的情况下。然而,如果我们将这个结构展平,它会变得更好:

{
    users: {
        1: {
            id: 1,
            name: 'Foo',
            friends: [2, 3]
        },
        2: {
            id: 2,
            name: 'Bar',
            friends: [3]
        },
        3: {
            id: 3,
            name: 'Baz',
            frineds: []
        }
    },

    allUsers: [1, 2, 3]
}

每个实体都存储在一个特定的位置。其他实体不能包含它的数据,只是通过id引用它,所以不需要同步变化。这种方法可以防止很多数据完整性问题(包括你的),并最大限度地减少应用程序的内存占用。

至于查询此类商店,您可以编写将此数据转换为更便于阅读的形状的函数,其中一个重要假设是它们的结果将是只读的。在 Redux 中,此类函数通常称为 selectors.