我一直在尝试使用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"
}
}任何帮助都是非常感谢的,还有文章,教程,视频例子。
谢谢,
发布于 2016-12-10 23:08:27
您不需要展平没有id的项。不能引用没有id的项。
您可以像在任何地方一样添加ids,但请注意,除非您计划从多个位置引用这些项,否则扁平化层次结构没有任何好处。它只会增加不必要的复杂性。
即使您的项已经具有id,除非您打算通过该id引用这些项,否则展平层次结构是没有用的。
当一个项目被多个其他对象使用时,您应该展平层次结构的一种情况。在这里,引用是至关重要的,因为当项目在一个地方被修改时,它可能在其他地方保持不变,即使你试图阻止它,因为一些人不知道有多个副本的错误或后来的代码更改。这导致了不同的副本,这本质上是数据损坏。
关系数据库通常引用只被引用一次的项,因为它们中的许多项不支持每行层次结构。这可以通过使用address_street和address_city之类的名称来缓解,而不是创建单独的地址表。在这种情况下,创建单独的表是不好的规范化。
另一方面,对象数据库对于单个对象中的分层数据没有问题。
在某些情况下,子对象仍然具有In。例如,在Mongo DB中,数组中的对象具有ids。这允许DB识别删除和重新排序。在React中,key属性的存在是出于完全相同的原因。
出于同样的目的,您也可以在自己的代码中使用这样的id,而不会使层次结构扁平化。
请注意,从代码中引用项也可能构成引用。
例如,如果您有一个组件WebSiteEditor,并且您没有扁平化层次结构,则该组件需要知道网站的id以及站点所属的用户的id。如果要展平层次结构,则此组件将只需要id。
嵌套项的Ids只需要是局部唯一的,而顶级项的ids需要是全局唯一的,或者至少是每个集合唯一的。
我的建议是不要展平项目,除非这些项目从多个地方引用。
https://stackoverflow.com/questions/41071062
复制相似问题