首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >规范化React/Redux应用程序的嵌套数据

规范化React/Redux应用程序的嵌套数据
EN

Stack Overflow用户
提问于 2016-12-10 08:56:54
回答 1查看 576关注 0票数 1

我一直在尝试使用https://github.com/paularmstrong/normalizr为我的redux存储规范化嵌套数据

登录用户后,我会返回一个响应,其中包含他们的信息以及与其他数据类型的关系。

代码语言:javascript
复制
{
"data": {
    "id": "207",
    "type": "users",
    "attributes": {
        "email": "roberta@nitzsche.biz",
        "last-sign-in-at": null,
        "username": "april.johns",
        "first-name": "Audie",
        "last-name": "Halvorson",
        "short-bio": "Ut exercitationem ",
        "bio": "Ut exercitationem totam perferendis consequatur dolorem veritatis dolorem.",
        "location": null,
        "gender": "male",
        "birthday": "1986-10-07",
        "email-digest": "daily_digest",
        "email-notifications": "instantl_notifications",
        "auth-token": "_HV-S6qrdobecr-rr6gs",
        "avatar-large-2x": "/missing_avatar.png",
        "avatar-large": "/missing_avatar.png",
        "cover-desktop-2x": "/missing_cover.png",
        "cover-desktop": "/missing_cover.png",
        "cover-mobile-2x": "/missing_cover.png",
        "cover-mobile": "/missing_cover.png",
        "wp-id": null,
        "created-at": "2016-10-07T23:16:13.565Z",
        "updated-at": "2016-10-07T23:16:13.565Z"
    },
    "relationships": {
        "websites": {
            "data": [
                {
                    "id": 11,
                    "url": "http://mohr.org/coy_rowe",
                    "user-id": 207,
                    "created-at": "2016-10-07T23:16:13.651Z",
                    "updated-at": "2016-10-07T23:16:13.651Z"
                }
            ]
        },
        "books": {
            "data": [
                {
                    "id": 11,
                    "name": "Outdoors & Industrial",
                    "image-url": "https://robohash.org/sitveritatisab.png?size=300x300&set=set1",
                    "author": "Meggie Balistreri",
                    "created-at": "2016-10-07T23:16:13.629Z",
                    "updated-at": "2016-10-07T23:16:13.629Z"
                }
            ]
        },
        "movies": {
            "data": [
                {
                    "id": 11,
                    "name": "Movies, Home & Electronics",
                    "image-url": "https://robohash.org/quiaarchitectoodit.png?size=300x300&set=set1",
                    "author": "Eveline Ziemann",
                    "created-at": "2016-10-07T23:16:13.642Z",
                    "updated-at": "2016-10-07T23:16:13.642Z"
                }
            ]
        },
        "interests": {
            "data": [
                {
                    "id": 22,
                    "name": "Synergistic Aluminum Gloves",
                    "created-at": "2016-10-07T23:16:13.596Z",
                    "updated-at": "2016-10-07T23:16:13.596Z"
                }
            ]
        },
        "virtues": {
            "data": [
                {
                    "id": 22,
                    "name": "Ergonomic Wool Gloves",
                    "created-at": "2016-10-07T23:16:13.582Z",
                    "updated-at": "2016-10-07T23:16:13.582Z"
                }
            ]
        },
        "features": {
            "data": [

            ]
        },
        "strengths": {
            "data": [
                {
                    "id": 22,
                    "name": "Ergonomic Wool Gloves",
                    "created-at": "2016-10-07T23:16:13.582Z",
                    "updated-at": "2016-10-07T23:16:13.582Z"
                }
            ]
        },
        "teachers": {
            "data": [
                {
                    "id": 22,
                    "name": "Ergonomic Wool Gloves",
                    "created-at": "2016-10-07T23:16:13.582Z",
                    "updated-at": "2016-10-07T23:16:13.582Z"
                }
            ]
        }
    }
}

}

在阅读了很多教程之后,我相信我的归一化数据将最好地表示为这个形状。

代码语言:javascript
复制
"currentUser" {
  "lastUpdated": 0,
  "userId": 207,
  "attributes": {
    "email": "roberta@nitzsche.biz",
    "last-sign-in-at": null,
    "username": "april.johns",
    "first-name": "Audie",
    "last-name": "Halvorson",
    "short-bio": "Ut exercitationem ",
    "bio": "Ut exercitationem totam perferendis consequatur",
    // etc....
  },
  "relationships": {
    "websites": [11],
    "books": [22],
    "movies": [33],
    "interests": [21],
    "virtues": [34],
    "features": [22],
    "strengths": [15],
    "teachers": [45],    
  }
}

网站、书籍、电影、兴趣、美德、优点、老师

例如,在他们选择兴趣的页面上,我得到了所有兴趣的回复。

代码语言:javascript
复制
[
    {
        "id": 54,
        "name": "Fantastic Wooden Hat",
        "created_at": "2016-10-12T18:54:01.669Z",
        "updated_at": "2016-10-12T18:54:01.669Z"
    },
    {
        "id": 55,
        "name": "Fantastic Wooden Hat",
        "created_at": "2016-10-12T18:54:01.669Z",
        "updated_at": "2016-10-12T18:54:01.669Z"
    },
    {
        "id": 56,
        "name": "Fantastic Wooden Hat",
        "created_at": "2016-10-12T18:54:01.669Z",
        "updated_at": "2016-10-12T18:54:01.669Z"
    },
    {
        "id": 57,
        "name": "Fantastic Wooden Hat",
        "created_at": "2016-10-12T18:54:01.669Z",
        "updated_at": "2016-10-12T18:54:01.669Z"
    }
]

我也把它正常化了。

代码语言:javascript
复制
{
    54: {
        "id": 54,
        "name": "Fantastic Wooden Hat",
        "created_at": "2016-10-12T18:54:01.669Z",
        "updated_at": "2016-10-12T18:54:01.669Z"
    },
    55: {
        "id": 55,
        "name": "Fantastic Wooden Hat",
        "created_at": "2016-10-12T18:54:01.669Z",
        "updated_at": "2016-10-12T18:54:01.669Z"
    },
    56: {
        "id": 56,
        "name": "Fantastic Wooden Hat",
        "created_at": "2016-10-12T18:54:01.669Z",
        "updated_at": "2016-10-12T18:54:01.669Z"
    },
    57: {
        "id": 57,
        "name": "Fantastic Wooden Hat",
        "created_at": "2016-10-12T18:54:01.669Z",
        "updated_at": "2016-10-12T18:54:01.669Z"
    }
}

任何帮助都是非常感谢的,还有文章,教程,视频例子。

谢谢,

EN

回答 1

Stack Overflow用户

发布于 2016-12-10 23:08:27

您不需要展平没有id的项。不能引用没有id的项。

您可以像在任何地方一样添加ids,但请注意,除非您计划从多个位置引用这些项,否则扁平化层次结构没有任何好处。它只会增加不必要的复杂性。

即使您的项已经具有id,除非您打算通过该id引用这些项,否则展平层次结构是没有用的。

当一个项目被多个其他对象使用时,您应该展平层次结构的一种情况。在这里,引用是至关重要的,因为当项目在一个地方被修改时,它可能在其他地方保持不变,即使你试图阻止它,因为一些人不知道有多个副本的错误或后来的代码更改。这导致了不同的副本,这本质上是数据损坏。

关系数据库通常引用只被引用一次的项,因为它们中的许多项不支持每行层次结构。这可以通过使用address_streetaddress_city之类的名称来缓解,而不是创建单独的地址表。在这种情况下,创建单独的表是不好的规范化。

另一方面,对象数据库对于单个对象中的分层数据没有问题。

在某些情况下,子对象仍然具有In。例如,在Mongo DB中,数组中的对象具有ids。这允许DB识别删除和重新排序。在React中,key属性的存在是出于完全相同的原因。

出于同样的目的,您也可以在自己的代码中使用这样的id,而不会使层次结构扁平化。

请注意,从代码中引用项也可能构成引用。

例如,如果您有一个组件WebSiteEditor,并且您没有扁平化层次结构,则该组件需要知道网站的id以及站点所属的用户的id。如果要展平层次结构,则此组件将只需要id。

嵌套项的Ids只需要是局部唯一的,而顶级项的ids需要是全局唯一的,或者至少是每个集合唯一的。

我的建议是不要展平项目,除非这些项目从多个地方引用。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41071062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档