Inheritance 如何在平坦的Redux存储中保留继承信息?

Inheritance 如何在平坦的Redux存储中保留继承信息?,inheritance,reactjs,redux,Inheritance,Reactjs,Redux,我在React应用程序中使用Redux进行状态管理。我还打算“扁平化”任何API响应,以鼓励重用并减少状态树中的数据重复。我希望用它来实现这一目标 我的问题是关于管理对象之间关系的首选方法,特别是继承类型关系 应用程序向API发出请求(后端用Java编写,Spring)。已定义的域模型包括以下关系: interface NamedThing { int getId(); String getName(); } interface Pet extends NamedThing {

我在React应用程序中使用Redux进行状态管理。我还打算“扁平化”任何API响应,以鼓励重用并减少状态树中的数据重复。我希望用它来实现这一目标

我的问题是关于管理对象之间关系的首选方法,特别是继承类型关系

应用程序向API发出请求(后端用Java编写,Spring)。已定义的域模型包括以下关系:

interface NamedThing {
    int getId();
    String getName();
}

interface Pet extends NamedThing {
    Person getOwner();
}

class Cat implements Pet {
    int getId() {
        ...
    };
    String getName() {
        ...
    };
    Person getOwner() {
        ...
    };
    int getNumberOfLivesRemaining() {
        …
    };
}

class Dog implements Pet {
    int getId() {
        ...
    };
    String getName() {
        ...
    };
    Person getOwner() {
        ...
    };
    int getAgeInDogYears() {
        …
    };
}

class Person implements NamedThing {
    int getId() {
        ...
    };
    String getName() {
        ...
    };
}
对/pets端点的GET请求的响应可能如下所示:

[{
    id: 1,
    type: ‘cat',
    name: ‘Fluffy',
    owner: {
        id: 1,
        name: ‘Mary'
    },
    numberOfLivesRemaining: 9
},
{
    id: 2,
    type: ‘dog',
    name: ‘Ralph',
    owner: {
        id: 1,
        name: ‘Mary'
    },
    ageInDogYears: 10
}]
在定义了正确的模式后,normalizer将平坦化对以下内容的响应:

{
    result: [
        {id: 1, schema: ‘cats’},
        {id: 2, schema: ‘dogs’}
    ],
    entities: {
        cats: {
            1: {
                id: 1,
                type: ‘cat’,
                name: ‘Fluffy’,
                owner: 1,
                numberOfLivesRemaining: 9
            }
        },
        dogs: {
            2: {
                id: 2,
                type: ‘dog',
                name: ‘Ralph',
                owner: 1,
                ageInDogYears: 10
            }
        },
        persons: {
            1: {
                id: 1,
                name: ‘Mary’
            }
        }
    }
}
方法1: 在应用程序状态下,不同的实体(猫、狗和人)可以存储在类似命名的集合中。然而,我会丢失猫和狗是宠物的细节,这是我打电话给宠物终端后知道的

方法2: 我可以将所有宠物实体存储在宠物集合中,并将所有猫的ID和所有狗的ID存储在单独的集合中。然后,我可以通过使用mapStateToProps函数进行相应过滤,将所有猫、所有狗或所有宠物传递到一个组件中

但是,如果我向/namedThings端点发出GET请求,我将返回猫、狗和人,并将它们存储在namedThings集合中,其中包含猫、狗和人的ID集合。但是,同样,我不知道猫和狗也是宠物,因为这些信息不包含在API响应中

为了解决这个问题,我可以:

  • 更改API,以便在响应中包含超级类型信息
  • 将猫和狗的集合映射到包含所有宠物的合并组件“道具”
  • 让还原者知道猫是宠物,因此在将猫添加到商店时,将id添加到宠物id集合中

  • 使用Redux和normalizer时,表示这种类型的实体层次结构的最佳方法是什么?其他团队是如何解决这个问题的?

    这两种方法听起来都不错:

  • 将猫和狗的集合映射到包含所有宠物的合并组件“道具”

  • 让还原者知道猫是宠物,因此在将猫添加到商店时,将id添加到宠物id集合中


  • 您应该同时尝试这两种方法,看看什么对您的应用程序更有意义。

    感谢您的回复,Dan和Redux等人!明确地说,建议是:;2.将每个实体类型存储在单独的集合和3中。将所有命名的子类实体存储在单个集合中。在Redux中存储这样的实体是否有首选方法?您能否建议这两种方法的优缺点,或者提供一些标准来评估哪种方法最适合我的应用程序?i、 测试和性能的含义是什么?我看不出有什么重要的区别。我无法评估什么是最好的,因为我没有看到UI、数据模型、需求等。