我有一个架构,其中一个字段引用它自己。我们如何避免这种情况。
我有一个如下所示的架构,其中“大陆”字段指的是它自己的架构。
type CountryCodeDto {
id : Int
threeLetterCode : String
countryName : String
capital : String
telCountryCode : String
officialLanguage : String
currency : [CurrencyDto]
regionsDto : [RegionsDto]
mainLand : CountryCodeDto
twoLetterCode : String
}
我的问题是,我可以查询此架构的深度有多深,就像下面的查询一样。以及如何避免这种嵌套。
query {
fetchCoutries {
id
capital
mainLand {
id
capital
mainLand {
id
capital
..
}
}
}
}
答案 0 :(得分:0)
如果您不需要查询大陆的大陆,则可以将其分为两种类型。这会限制深度,但会造成一些重复,例如:
type CountryCodeDto {
id : Int
threeLetterCode : String
countryName : String
capital : String
telCountryCode : String
officialLanguage : String
currency : [CurrencyDto]
regionsDto : [RegionsDto]
mainLand : Mainland
twoLetterCode : String
}
type Mainland {
id : Int
threeLetterCode : String
countryName : String
capital : String
telCountryCode : String
officialLanguage : String
currency : [CurrencyDto]
regionsDto : [RegionsDto]
twoLetterCode : String
}
您还可以标准化返回的数据,其中mainLand
字段返回关联国家/地区的ID,而不是完整对象。如果客户需要实际显示有关大陆的信息(并可能显示其他查询),这意味着要为客户进行更多工作,但这在某些情况下可能是合适的解决方案。
mainLand: Int
或者,您可以保留架构。从安全角度来看,无论如何都要实现类似graphql-depth-limit的解决方案是一个好主意,它可以帮助减少过多的递归查询。您还可以使用dataloader来最大程度地减少在同一请求中从数据库中重复获取同一项目的影响。