Restlet APISpark-对实体存储中的一对多关系的JSON响应



因此,这是一个场景,我有3个信标(BEACON_TABLE)和一些产品(PRODUCT_TTABLE),其中每个产品都与其中一个信标相关联(一对多关系)。数据模型可以很好地使用SQL,其中,我只是在PRODUCT_TABLE中使用外键来引用beacon_TABLE的特定信标id。我在实体存储(全栈/无包装器)中完成了这一操作,在那里我向PRODUCT_TABLE添加了一个属性,并将Reference-typed设置为BEACON_TABLE。当我在BEACON_TABLE资源上运行GET方法时,它只显示信标数据,但我期望所有与信标相关的产品都有响应。JSON响应类似于以下内容:

[
{"beacon_id":"beacon1", "products": [
{"id":"prod1","price":"1.50"},
{"id":"prod2","price":"2.50"}
]
},
{"beacon_id":"beacon2", "products": [
{"id":"prod30","price":"3.95"},
{"id":"prod40","price":"5.15"}
]
}
]

我如何在实体商店中实现它?我浏览了用户指南中的用户评论场景,但我并不清楚。我们将非常感谢您的帮助。

APISpark目前不支持开箱即用的此功能。我的意思是在其他实体中定义具有依赖关系的元素。我猜你来自关系世界;-)

我向您建议的方法(以及APISpark推荐的方法)是利用APISpark的特性"复合字段"来取消实体存储的规范化。这种方法是noSQL世界中的常见模式(APISpark默认基于noSQL数据库),因为没有类似SQL的联接支持。

使用这种方法具有性能优势,因为只需要向数据库发出一个请求,而不需要N+1(实际上不止一个)。

以下是针对您的用例的方法:

  • 实体Beacon
    • 基元域beacon_id
    • 包含子字段的复合字段products(list=true):
    • 基元域id
    • 基元域price
  • 实体Product
    • 基元字段id
    • 基元域price

为实体存储添加字段时,可以在下拉列表"类型"中指定类型composite。之后,您将能够直接在此字段上创建子字段(字段名称附近的图标+)。

主要的缺点是,当您想要更新产品时,需要进行两次更新。我想这种情况并不常见,所以这种方法是可以接受的。

如果不清楚,请随时问我更多问题!

希望它能帮助你,Thierry

最新更新