2017-08-08 39 views
0

我對GraphQL比較新,我注意到你可以用兩種不同的方式選擇相關的字段。假設我們有一個droids表和humans表,而droidsowner這是humans表中的記錄。還有的(至少)兩種方法可以表達這一點:GraphQL:這兩種模式中的任何一種都更好/更糟?

query DroidsQuery { 
    id 
    name 
    owner { 
    id 
    } 
} 

或:

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

乍一看,前者似乎更地道,而且很明顯,如果你要選擇的多個領域具有優勢( owner { id name }與必須製作新的ownerName,因此您可以執行ownerId ownerName)。但是,對於ownerId風格有一定的明確性,因爲您在表達「這是我特別期望您選擇的這種東西」。

此外,從實現的角度看,這似乎是owner { id }會借給自己的解析器進行不必要的JOIN,因爲它會轉化owner { id }humans表(的id列與一個ownerId領域,它與自己的解析器知道它不需要JOIN來獲得droids表的owner_id列)。

正如我所說,我是GraphQL的新手,所以我確信這個問題有很多細微之處,如果我使用它更長時間,我會很感激。因此,我希望從使用GraphQL的人處獲悉這兩種方法的優缺點。爲了清楚起見(並且爲了避免這個答案被關閉),我正在尋找明確的「這裏是一種方法比另一種方法客觀地壞/好」,而不是主觀的「我更喜歡一種方法」的答案。

回答

1

您應該明白GraphQL只是一種查詢語言+執行語義。對於如何呈現數據以及如何解析數據沒有限制。

沒有什麼能阻止你做你描述的事情,並返回owner object和ownerId。

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 
} 

你已經指出了存在的主要問題:前者實現看起來更地道。不,你不會製作一個慣用的代碼,你會製作實用的代碼。

爲您設計領域分頁中GraphQL一個真實世界的例子:

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

第一次,你查詢一個機器人+的朋友,這是好的。

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

然後,您點擊更多加載更多的朋友;它擊中DroidsQuery一次解決的下一個朋友前查詢以前的機器人對象:

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

所以實際的做法是有另一個DroidFriendsQuery查詢直接從機器人ID解決啦。

+0

謝謝你的詳細答案,但我覺得你所說的是「你可以做到這一點」。事情是,我已經知道我可以這樣做;我真正想要理解的是以這種方式做這種或那種做法的優點/缺點(即權衡)。 – machineghost

相關問題