这个问题主要与如何使用 CRNK 框架执行此操作有关,但是我也将其标记为 JSON-API,因为我对这种方法在 JSON-API 规范的范围内是否普遍正确感兴趣。
我不想通过深入了解问题所涉及的确切领域的细节来使事情复杂化,所以我将稍微简化一下。
我有一个队列,它具有各种属性,例如名称、描述等。队列的另一个属性是一些历史时间戳数据,本质上是一个看起来像这样的对象数组:
{ "time": "21/10/2018 10:15 GMT", "value": 35 }
实际上,队列可以具有许多与该队列的不同数据相关的这些属性。阵列中的数据量可能非常大,具体取决于已收集的数据量。
我的第一个直觉是在队列中为这个属性建模:
{
data: {
...
attributes: {
...
history: [
{ "time": "21/10/2018 10:15 GMT", "value": 35 },
{ "time": "21/10/2018 10:30 GMT", "value": 35 },
{ "time": "21/10/2018 10:45 GMT", "value": 35 }
]
}
}
}
然而,我对这种方法的问题是整个数据集将与队列一起返回(这可能非常大,并不总是需要)。我可以通过使用稀疏字段集来解决这个问题,但我并不特别喜欢使用不同的字段参数一遍又一遍地请求队列以获取我在特定场景中所追求的数据的概念。
我想做的是将此历史数据建模为关系,这样可以通过关系 URL 访问数据,例如/api/queues/1/history
这对我来说似乎最有意义,因为 API 的预期用途是各种屏幕将使用附加到队列的不同数据集,因此每个屏幕都有队列对象,然后可以通过这些关系链接请求它感兴趣的数据。
然而,我遇到的问题是,这里的历史数据不作为后端的可识别资源存在,仅作为队列的子资源存在(即 select * from historydata where queueid = 1)。这是我不确定如何在 CRNK 中实现它的地方。似乎要为关系建模,我还必须为子资源(/api/history/{id})创建一个 ResourceRepository。但我不想要这个。
所以我关于 CRNK 实现的问题是如何配置我的资源和存储库,以便:
GET /api/history/{id} - always returns 404 (ideally without having to implement this myself in a HistoryResourceRepository)
GET/PATCH /api/queues/1/history - will go through the queue repository to access and update the history data using the queue ID as the identifier
此外,在旁注中,将 ID 分配给子资源的推荐方法是什么,因为它在这方面不作为可识别实体存在并且 ID 在很大程度上无关紧要?