2016-04-18 47 views
5

Pracuję nad aplikacją, dla której badamy możliwość użycia jsonapi do opisu danych we wszystkich odpowiedziach interfejsu API. Działa całkiem nieźle dla podmiotów podobnych do zasobów, ale mamy problem z wymyśleniem sposobu na opisywanie danych raportów w sposób podobny do jsonapi.Reprezentacja nieskomplikowanych danych zagregowanych za pomocą interfejsu JSON API

Dane dotyczące raportów dotyczą danych zagregowanych i obliczanych w locie z bazowych danych podobnych do zasobów, które przechowujemy w naszej bazie danych. Na przykład, wyobraźmy sobie, że przechowujemy informacje o nieruchomościach i mamy informacje na temat domów, mieszkań i powierzchni biurowych, z których każda jest związana z lokalizacją, wielkością nieruchomości w stopach kwadratowych, rodzajem nieruchomości (w przeciwnym razie jest to dom, mieszkanie lub biuro), oraz wszelkie inne istotne informacje dotyczące nieruchomości. Teraz wyobraźmy sobie, że potrzebujemy raportu, który odbiera ?group_by[]=location&group_by[]=type i chcemy, aby odpowiedź przekazała zagregowane informacje o przecięciu tych dwóch parametrów: group_by. Otrzymalibyśmy na przykład obiekt zawierający średnią kwadratową powierzchnię wszystkich obiektów w danej lokalizacji, pogrupowaną również według rodzaju nieruchomości.

Average Property Sizes (in square feet) 
       Houses Apartments Offices 
Manhattan  1234.56  234.56 123.45 
Cape Coral  456.78  654.32 876.54 
Portland  4321.00  987.65 2345.67 

Najbardziej rzeczą zasobów jak możemy myśleć z tych danych jest każda komórka, ale ponieważ są one wynikiem komputerowej agregacji kilku podstawowych danych, nie mają naturalną ID. Zastanawialiśmy się także nad dostarczeniem ich z wyliczonym identyfikatorem (być może łącząc identyfikatory wymiarów, według których zgrupowane są ich dane, tj. "house,34", gdzie house reprezentuje typ własności, a 34 jest identyfikatorem lokalizacji "Manhattan"). Następnie każda komórka miałaby relację z odpowiednim rekordem lokalizacji, który zostałby zawarty w sekcji ładunku o wartości . Oto przykładowy plik json, jak miałoby to wyglądać tak:

{ 
    "data": [ 
    { 
     "id": "house,123", 
     "type": "report_items", 
     "attributes": { 
     "property_type": "house", 
     "value": 108.75 
     }, 
     "relationships": { 
     "location": { 
      "data": { 
      "type": "locations", 
      "id": 123 
      } 
     } 
     } 
    }, 
    { 
     "id": "house,124", 
     "type": "report_items", 
     "attributes": { 
     "property_type": "house", 
     "value": 36.0 
     }, 
     "relationships": { 
     "location": { 
      "data": { 
      "type": "locations", 
      "id": 124 
      } 
     } 
     } 
    }, 
    { 
     "id": "house,125", 
     "type": "report_items", 
     "attributes": { 
     "property_type": "house", 
     "value": 1.0 
     }, 
     "relationships": { 
     "location": { 
      "data": { 
      "type": "locations", 
      "id": 125 
      } 
     } 
     } 
    }, 
    { 
     "id": "office,123", 
     "type": "report_items", 
     "attributes": { 
     "property_type": "office", 
     "value": 4.0 
     }, 
     "relationships": { 
     "location": { 
      "data": { 
      "type": "locations", 
      "id": 123 
      } 
     } 
     } 
    }, 
    { 
     "id": "office,124", 
     "type": "report_items", 
     "attributes": { 
     "property_type": "office", 
     "value": 2.0 
     }, 
     "relationships": { 
     "location": { 
      "data": { 
      "type": "locations", 
      "id": 124 
      } 
     } 
     } 
    }, 
    { 
     "id": "apartment,123", 
     "type": "report_items", 
     "attributes": { 
     "property_type": "apartment", 
     "value": 2.0 
     }, 
     "relationships": { 
     "location": { 
      "data": { 
      "type": "locations", 
      "id": 123 
      } 
     } 
     } 
    }, 
    { 
     "id": "apartment,125", 
     "type": "report_items", 
     "attributes": { 
     "property_type": "apartment", 
     "value": 4.5 
     }, 
     "relationships": { 
     "location": { 
      "data": { 
      "type": "locations", 
      "id": 125 
      } 
     } 
     } 
    }, 
    { 
     "id": "apartment,124", 
     "type": "report_items", 
     "attributes": { 
     "property_type": "apartment", 
     "value": 2.0 
     }, 
     "relationships": { 
     "location": { 
      "data": { 
      "type": "locations", 
      "id": 124 
      } 
     } 
     } 
    } 
    ], 
    "included": [ 
    { 
     "type": "locations", 
     "id": "123", 
     "attributes": { 
     "name": "Manhattan" 
     } 
    }, 
    { 
     "type": "locations", 
     "id": "124", 
     "attributes": { 
     "name": "Cape Coral" 
     } 
    }, 
    { 
     "type": "locations", 
     "id": "125", 
     "attributes": { 
     "name": "Portland" 
     } 
    } 
    ] 
} 

Moje pytanie brzmi: czy jest to właściwy sposób przedstawiania tego rodzaju danych w jsonapi? Czy jsonapi jest odpowiednie i/lub zalecane dla danych, które nie są bezpośrednio mapowane na zasoby? Czy lepiej byłoby reprezentować te dane w niestandardowym jsonie? Wiem, że żadne z tych pytań prawdopodobnie nie mają jednoznacznej odpowiedzi, ale być może jest już pewne doświadczenie, jak podejść do podobnych scenariuszy, plusów i minusów próbowania dopasowania tego rodzaju danych do jsonapi itp. Wszelkie uwagi i pomoc są bardzo bardzo doceniane. Dzięki.

PS: Opublikowaliśmy to nawet po tym, jak poszedłem na forum i w Internecie, i to są tylko dwa linki, które znalazłem mówiąc o czymś, co przypomina to, co próbuję się dowiedzieć, i je uwzględniam tutaj o referencje, a także: 1.- http://discuss.jsonapi.org/t/composite-id-inside-the-resource-object/367/13 2.- http://discuss.jsonapi.org/t/extension-for-chart-graph-data/408

+0

Nie proszę o konkretne rozwiązanie tego konkretnego przypadku, ale o pewne informacje dotyczące możliwości wykorzystania interfejsu JSON API dla tego rodzaju nieopłacalnych danych. Czy jest to zalecane? Czy powinienem podjąć dodatkowy wysiłek, próbując dostosować moje dane do interfejsu JSON API? A może interfejs API JSON został zaprojektowany z myślą o wykorzystaniu danych podobnych do zasobów? – Ernesto

Odpowiedz

3

ogólna odpowiedź jest rozważenie, które dane są na tyle istotne, by uzasadnić swoją tożsamość po obu stronach swojej API. Chodzi o to, aby zdecydować, które rzeczy albo chcesz później odwołać, albo przedstawić w związku. Interfejs API JSON pozwala definiować te zasoby jako zasoby i umożliwia mieszanie zasobów z bardziej ogólnym JSON dla nieprzezroczystych danych.

Na przykład być możeoraz opcje i filtry, które zostały użyte do ich utworzenia, warto śledzić, aby klient mógł poprosić o ponowne obejrzenie tego samego raportu przez jego id. Może chcesz odpytać swój serwer, aby zobaczyć, które raporty są tworzone.

Po stronie klienta możesz chcieć przedstawić linki z zasobów property_type, aby uzyskać więcej informacji na temat tych typów nieruchomości.

A może wyniki w raporcie są lepiej reprezentowane jako blob JSON w obrębie zasobu. attributes i meta może zawierać dowolny typ wartości JSON.

W danym przypadku, podstawowy zasób może być typu reports lub tablicy report_items, a może nawet tablicy property_summaries z relacji do property_types i locations.

Jeśli wybierzesz bardziej ogólne typy zasobów, możesz uogólnić proces raportowania, ale możesz nie uchwycić istotności danych.

Jeśli wybierzesz bardzo szczegółowe zasoby do raportowania, musisz naprawdę dostosować każdy typ raportu, ale będziesz w stanie uzyskać znaczące połączenia między zasobami na kliencie.