2016-08-12 1 views
1

Ich habe mir die JSON-API angesehen und mich immer wieder auf Skalierbarkeitsszenarien festgelegt. Nehmen wir an, Sie haben eine große Sammlung (1000) von Modellen mit jeweils 3 oder 4 Beziehungen.JSON-API-Skalierung

Von meinem Verständnis, JSON API erfordert, dass Sie mindestens die Beziehungen mit ihrer zugehörigen ID angeben (n) (und ggf. die Beziehung mit include Sideload). Wenn die Sammlung von 1000 Modellen ein JOIN für jede einzelne Beziehung zu tun hat, in der Lage sein, die gültige JSON API Nutzlast wie unten zu füllen:

... 
{ 
    "some_relationship_name": { 
    data: [ 
     { id: 1, type: "derp" } 
     ... 
    ] 
    } 
} 

Ich sehe nicht, wie dies möglicherweise eine vernünftige Art und Weise skalieren kann.

Antwort

0

Ich bin mir nicht sicher, wo Sie Problem sehen können. Sie haben 20 Bytes pro Relationen/4 Beziehungen/1000 Datensätze => ~ 100kB. Vorhandene Adapter sollten keine Probleme mit der Verarbeitung solcher Daten schnell genug haben.

Wenn Sie weniger Daten transportieren müssen, gibt es mehrere Möglichkeiten. Sie können die Komprimierung hinzufügen, aber beachten Sie, dass es bei solchen kleinen Daten in der Regel schneller ist, Daten zu übertragen, als sie zu komprimieren.

Andere Option ist, nur die Daten zu senden, die Sie wirklich brauchen. Normalerweise brauchen Sie nicht sofort 1000 Datensätze in der Web-App. Paging und Lazy-Loading sollten Ihnen daher helfen, nur die Daten zu senden, die wirklich benötigt werden.

+0

Ich hätte klarer sein sollen. Ich mache mir keine Sorgen über die Größe der Nutzlast, ich mache mir Sorgen um 'JOIN' Leistung. Normalerweise müssten Sie bei dieser Art von Daten die Beziehungs-IDs nicht einfügen, es sei denn, Sie wollten JSON-API-konform sein, aber Sie müssen. – maschwenk

1

Sie müssen id s der Beziehungen nicht angeben. Sie können einfach die links angeben, um eine Möglichkeit zum Abrufen der Links bereitzustellen. Zur Kasse gehen the specification.

So können Sie etwas tun:

{ 
    id: '1' 
    type: 'base' 
    relationships: { 
     relA: { 
      links: { 
       self: '/base/1/relationships/relA', 
       related: '/base/1/relationships/relA/related', 
      } 
     }, 
     ... 
    } 
    attributes: {...} 
} 

Also müssen Sie nichts JOIN Sie nicht direkt tun müssen. Zum Beispiel in einer Liste, die Sie Informationen, die Sie nur in der Detailansicht benötigen, nicht beitreten.