2017-08-08 2 views
0

Ich bin relativ neu in GraphQL, und ich habe festgestellt, dass Sie verwandte Felder auf eine von zwei verschiedenen Arten auswählen können. Nehmen wir an, wir haben eine droids Tabelle und eine humans Tabelle, und droids haben eine owner, die ein Datensatz in der humans Tabelle ist. Es gibt (mindestens) zwei Möglichkeiten, können Sie dies auszudrücken:GraphQL: Sind beide Muster besser/schlechter?

query DroidsQuery { 
    id 
    name 
    owner { 
    id 
    } 
} 

oder:

query DroidsQuery { 
    id 
    name 
    ownerId # this resolves to owner.id 
} 

Auf den ersten Blick die frühere mehr idiomatische scheint, und natürlich, wenn Sie mehrere Felder sind die Auswahl hat Vorteile (owner { id name } vs eine neue ownerName machen müssen, damit Sie ownerId ownerName tun können). Allerdings gibt es eine gewisse Offenheit für den Stil ownerId, wie Sie ausdrücken "hier ist das Ding, das ich speziell erwartet habe, dass Sie auswählen".

Auch von einer Implementierung Standpunkt scheint es, wie owner { id } würde selbst macht eine unnötiges JOIN zu dem Resolver verleihen, wie es owner { id } als id Spalte der Tabelle humans (gegenüber einem ownerId Feld übersetzen würde, die mit ihrem eigenen Resolver, weiß, dass es kein JOIN benötigt, um die owner_id Spalte der droids Tabelle zu erhalten).

Wie ich schon sagte, ich bin neu in GraphQL, also bin ich sicher, dass es viele Nuancen zu dieser Frage gibt, die ich schätzen würde, wenn ich sie länger benutzt hätte. Daher habe ich auf Erkenntnisse von jemandem gehofft, der GraphQL in die Vor- und Nachteile beider Ansätze eingesetzt hat. Und um klar zu sein (und um zu vermeiden, dass diese Antwort geschlossen wird), suche ich explizit "hier ist was objektiv schlecht/gut über einen Ansatz gegenüber dem anderen", nicht subjektiv "Ich bevorzuge einen Ansatz" Antworten.

Antwort

1

Sie sollten verstehen, GraphQL ist nur eine Abfragesprache + Ausführung Semantik. Es gibt keine Einschränkungen, wie Sie Ihre Daten präsentieren und wie Sie Ihre Daten auflösen.

Nichts hält Sie davon ab, das zu tun, was Sie beschreiben, und gibt sowohl Eigentümerobjekt als auch ownerId zurück.

type Droid { 
    id: ID! 
    name: String! 
    owner: Human! # use it when you want to expand owner detail 
    ownerId: ID! # use it when you just want to get id of owner 
} 

Sie zeigte bereits das Hauptproblem aus: die frühere Implementierung scheint mehr idiomatische. Nein, du machst keinen idiomatischen Code, du machst praktischen Code.

Ein Beispiel aus der Praxis, wie Sie Feld Paginierung in GraphQL Design:

type Droid { 
    id: ID! 
    name: String! 
    friends(first: Int, after: String): [Human] 
} 

Das erste Mal, fragen Sie einen Droiden + Freunde, und es ist in Ordnung.

{ 
    query DroidsQuery { 
    id 
    name 
    friends(first: 2) { 
     name  
    } 
    } 
} 

Dann klicken Sie auf mehr, um mehr Freunde zu laden; es trifft DroidsQuery ein weiteres Mal die vorherige droid Objekt abzufragen, bevor die nächsten Freunde Lösung:

{ 
    query DroidsQuery { 
    id 
    friends(first: 2, after: "dfasdf") { 
     name  
    } 
    } 
} 

So ist es praktisch, eine andere DroidFriendsQuery Abfrage haben, um direkt Freunde von droid id zu lösen.

+0

Vielen Dank für diese detaillierte Antwort, aber ich fühle mich wie Sie sagen, "Sie können es so oder so tun".Die Sache ist, ich weiß bereits, dass ich es auf jede Weise tun kann; Was ich wirklich zu verstehen versuche, sind die Vorteile/Nachteile (dh die Kompromisse), dies auf die eine oder andere Weise zu tun. – machineghost

Verwandte Themen