在JSON REST Web服务中表示外键关系的标准方法

8

我有一个葡萄酒实体与一个国家存在一对多关系 (一个国家 - 多个葡萄酒)

我可以想到两种在JSON web服务中表示此关系的方法:

第一种方法是在JSON中包含整个国家

{
  id: 76,
  code: "FR",
  name: "France"
}

{
  id: 79,
  name: "Bordeaux",
  country: {
      id: 76,
      code: "FR",
      name: "France"
    },
  year: "2005"
}

另一种方法是将每个国家的属性归为相同级别,并添加前缀。
{
  id: 79,
  name: "Bordeaux",
  countryId: 76,
  countrCode: "FR",
  countryName: "France"
  year: "2005"
}

无论如何,在更新或创建新的葡萄酒时,我只会保存国家ID,不允许从葡萄酒端点修改国家。
第二种方法更容易实现(我将在数据库上创建一个联接视图,序列化器将仅将每个字段转换为JSON),但我认为第一种方法更加优雅。
只想知道是否有任何标准适用于这种情况,如果没有,什么是更常见的方法...
注:我并不是要开始关于“RESTful”解决方案的辩论,只是寻找一种聪明而简单的处理关系的方式...
2个回答

6
在你的情况下,国家很小,可以考虑每次嵌套它。不过,并不总是这样,也没有我找到的关于处理这个问题的标准。 我使用了自定义引用类型来完成这个操作:
{
    "id": 79,
    "name": "Bordeaux",
    "country": {
        "ref": {
            "id": 76,
            "uri": "/country/76"
        }
    },
    "year": "2005" }

一些有用的想法,这里也有一些链接

谢谢 opensas - 实际上还缺了很多。已经进行了代码检查。 - Roy Truelove
我实现了类似的东西,但没有 ref,这是它在 openshift 上运行的链接:http://ideas-jugar.rhcloud.com/api/ideas,并且 git repo:https://github.com/RestOpenGov/ideas-ba/tree/master/webservice,所以 ref 是否真的有必要呢? - opensas
我没有在你的示例中看到任何外部引用,只有嵌套对象和自引用。 - Roy Truelove
我只是试验性地在 idea 实体中实现了它,参见 url 属性,但想法是拥有嵌套的对象,每个对象都有一个 url 属性。 - opensas

-5

JSon并不是用来拥有外键的。这与关系型数据库有关。在我看来,JSon应该将所有嵌套的内容都显示出来。

MongoDB加强了这种观点。在MongoDB中,您将所有内容存储为JSon,并且“FKs”包含在同一文档中。如果您需要FKs,则我认为您不需要mongo,也不需要JSon。

顺便说一句,如果您总是要显示国家,那么每次进行两个请求就没有意义。


7
这个答案忽略了我们所讨论的是一个使用JSON序列化的RESTful Web服务,因此需要表示对象之间的关系。 - Daniel Watkins
@DanielWatkins +1 同意,JSON 数据对象的表示和关系型数据库之间没有阻抗不匹配。 - Morten Jensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接