2016-12-10 2 views
1

Я пытался обернуть мою голову вокруг нормализации вложенных данных для моего Redux магазина с https://github.com/paularmstrong/normalizrНормализация вложенности данных для React/Redux App

После входа в систему пользователь, я получаю обратно ответ с их информацией и отношения к другим типы данных.

{ 
"data": { 
    "id": "207", 
    "type": "users", 
    "attributes": { 
     "email": "[email protected]", 
     "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": "[email protected]", 
    "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],  
    } 
} 

Означает ли это, что я создаю схемы для всех типов отношений?

сайты книга фильмов интересы добродетель особенность сильных учителей

, а затем один relationshipSchema, который получает определенный со всеми этими схемами вложенными? Для всех отношений отношения будут ссылаться в разных областях, хотя на сайте.

ex) страница, на которой они выбирают интересы, и я получаю ответ от всех интересов.

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

Любая помощь будет принята с благодарностью, также статьи, учебные пособия, примеры видео там также.

Спасибо,

ответ

2

Вам не нужно, чтобы сгладить элементы, которые не имеют идентификатора. Элементы, которые не имеют идентификатора, не могут быть по ссылке.

Вы можете добавить идентификаторы, как и везде, но обратите внимание, что, если вы не планируете ссылаться на эти предметы из нескольких мест, нет никакой пользы для выравнивания иерархии. Это добавляет ненужную сложность.

Даже если у ваших элементов уже есть идентификаторы, нет необходимости в выравнивании иерархии, если вы не планируете ссылаться на эти элементы по этому идентификатору.

В одном случае, когда вы должны сгладить иерархию, когда один элемент используется более чем одним другим объектом. Здесь ссылка имеет решающее значение, поскольку в противном случае, когда элемент изменен в одном месте, он может оставаться тем же самым в другом месте, даже если вы попытаетесь предотвратить это, из-за ошибок или более поздних изменений кода, сделанных кем-то, кто не знал, что существует несколько копий. Это приводит к расходованию копий, которые по сути являются повреждением данных.

Реляционные базы данных часто ссылаются на элементы, на которые ссылаются только один раз, поскольку многие из них не поддерживают иерархии строк. Это можно уменьшить, используя имена, такие как address_street и address_city, вместо создания отдельной таблицы адресов. Создание отдельных таблиц в этом случае - плохая нормализация.

Базы данных объектов, с другой стороны, не имеют проблем с иерархическими данными в одном объекте.

В некоторых случаях под-объекты все еще имеют идентификаторы. Например, в Mongo DB объекты в массивах имеют идентификаторы. Это позволяет БД распознавать удаления и переупорядочивать. В React существует key prop по той же самой причине.

Вы можете использовать такой идентификатор в своем собственном коде также для этой же цели, не сглаживая иерархию.

Обратите внимание, что ссылки на элементы из кода могут также служить ссылкой.

Например, если у вас есть компонент WebSiteEditor и вы не придавить иерархии, компонент должен знать идентификатор сайта, а также идентификатор пользователя, которому принадлежит сайт. Если вы do сгладить иерархию, для этого компонента потребуется только идентификатор.

Идентификаторы вложенных элементов должны быть только локально уникальными, тогда как идентификаторы элементов верхнего уровня должны быть глобально уникальными или, по крайней мере, уникальными для каждой коллекции.

Моя рекомендация состоит в том, чтобы не сгладить элементы, если на эти предметы не указаны более чем одно место.

+0

Благодарим вас за разъяснение этого. Похоже, я получал маленький спусковой крючок, который был доволен идеей сглаживания моих данных. Прочитав ваш ответ и снова подумав о проблеме. Кажется, что я действительно хочу сосредоточить свои усилия только на выравнивании данных 'отношений', поскольку эти типы отношений будут использоваться в нескольких местах. – VinceBrown

Смежные вопросы