我的API包含一个Book
实体,它根据语言表示几个可能BookContent
的集合。 BookContent
是具有Title
和Content
属性的另一个实体,它们都依赖于Language
。
Book
应该是这样的:
1)
[
{
"language": "English",
"title": "First title",
"content": "First content"
},
{
"language": "French",
"title": "Premier titre",
"content": "Premier contenu"
}
]
或者喜欢:
2)
{
"English": {
"title": "First title",
"content": "First content"
},
"French": {
"title": "Premier titre",
"content": "Premier contenu"
}
}
选项1):
language
属性可以包含任何Unicode字符(而不能作为密钥)。BookContent
实体,只返回BookContent
ID,则可以更容易地用ID替换每个元素。选项2):
这是一个普遍的问题,要知道哪一个看起来更像是“最佳实践”,没有假设客户端如何查询/使用REST API,也没有假设性能如何与灵活性等相关。
哪种选择通常更像是“最佳做法”?
答案 0 :(得分:3)
您在问题中说明:
这是一个普遍的问题,要知道哪一个看起来更像是“最佳实践”,而不考虑客户端如何查询/使用REST API。
您正在编写旨在帮助客户获取信息的REST服务 - 如果这不是您的目标,那么编写它就没有意义。因此,您需要回答的最重要的问题是“客户想要什么信息?”。 的答案将决定数据的结构,而不是“哪一个看起来更好?” - 我们不是您服务的最终用户。
就个人而言,我会选择第一个,因为在我的对象中有一个名为books.English
的数组似乎是错误的,它还允许使用AZ以外的字符的语言,并适用于语言未知(或混合)的书籍。如果单个书的简单性是关键(并且语言列表是明确定义且有限的),那么请考虑:
[
{
"language": "English",
"books": [{
"title": "First title",
"content": "First content"
}]
},
{
"language": "French",
"books": [{
"title": "Premier titre",
"content": "Premier contenu"
}]
}
]
然而,从本质上讲,除了“使它们有用”之外,对于您正在构建的数据结构没有单一的最佳实践。