我们有一个 REST API,其中一部分显示用户的“目录”。目录是产品列表以及一些整体目录元数据(例如剩余金额)。
我们正处于尝试将此元数据添加到目录响应的阶段,但被困在我们的数据库设计上。后备存储是 Amazon 的 DynamoDB,它只是一个键值存储。值得注意的是,它支持主键(“哈希”)和辅助键(“范围”)。
目前我们的数据库条目如下所示:
{ customerId: "xxx", productId: "yyyy", productPrice: "zzz" }
我们可以或多或少地直接将这些翻译成目录条目,从而产生以下响应
{ products: [{ id: "yyyy", price: "zzz" }] }
但是我们现在想要一个带有元数据的响应,比如
{ metadata: { moneyLeft: 5 }, products: [{ id: "yyyy", price: "zzz" }] }
问题是,我们如何将元数据存储在我们的数据库中?
方法 #1:分离数据库
创建一个单独的元数据表,其中包含customerId
所有元数据属性的主键和列。然后查询两个表(对 DynamoDB 的两个 HTTP 请求),并组合结果。
方法#2:面向查询
重新调整当前表的用途,使其专为此目录显示查询而设计。它将有两种类型的行,例如
{ customerId: "xxx", productId: "yyyy", productPrice: "zzz", type: "product" }
{ customerId: "xxx", moneyLeft: 5, type: "metadata" }
(虽然更强大一点)。然后我们可以使用 查询从表中选择所有行,并在我们的服务器代码中通过打开属性customerId = xxx
将它们转换为所需的响应。type
我倾向于方法#2,因为方法#1 似乎仍然停留在关系数据库思维中,并且它会涉及两个数据库调用(= HTTP 请求)。但这太奇怪了,我不确定这是个好主意。也许有第三种方法?我想真正的答案是“你应该使用文档数据库”,但我们现在非常致力于 DynamoDB -_-。