1

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

登录用户后,我会收到回复,其中包含他们的信息以及与其他数据类型的关系。

{
"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"
                }
            ]
        }
    }
}

}

在阅读了很多教程之后,我相信我的标准化数据最好用这个形状来表示。

"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],    
  }
}

这是否意味着我为所有关系类型创建模式?

网站 书籍 电影 兴趣 美德 功能 优势 老师

然后是一个使用所有嵌套模式定义的关系模式?对于关系的所有类型,将在站点外的不同区域中引用。

例如)他们选择兴趣的页面,我会收到所有兴趣的回复。

[
    {
        "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"
    }
]

我也将其标准化...

{
    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"
    }
}

任何帮助将不胜感激,还有文章、教程、视频示例。

谢谢,

4

1 回答 1

3

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

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

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

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

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

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

在某些情况下,子对象仍然有 ID。例如,在 Mongo DB 中,数组中的对象具有 id。这允许数据库识别删除和重新排序。在 React 中,keyprop 存在的原因完全相同。

你也可以在你自己的代码中使用这样的 id 来达到同样的目的,而不会使层次结构变平。

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

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

嵌套项的 ID 只需要在本地是唯一的,而顶级项的 ID 需要是全局唯一的或至少每个集合都是唯一的。

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

于 2016-12-10T15:08:26.607 回答