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
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