Database design 键值存储“行”的类型完全不同,这是一种好的做法吗?

Database design 键值存储“行”的类型完全不同,这是一种好的做法吗?,database-design,nosql,amazon-dynamodb,Database Design,Nosql,Amazon Dynamodb,我们有一个RESTAPI,其中一部分显示用户的目录。目录是产品列表以及一些总体目录元数据,例如剩余金额 我们正试图将此元数据添加到目录响应中,但在数据库设计上遇到了问题。支持商店是亚马逊的DynamoDB,它只是一个键值商店。值得注意的是,它支持主键散列和辅助键范围之类的内容 目前,我们的数据库条目如下所示: { customerId: "xxx", productId: "yyyy", productPrice: "zzz" } 我们可以或多或少地直接将这些内容转换为目录条目,从而得到 {

我们有一个RESTAPI,其中一部分显示用户的目录。目录是产品列表以及一些总体目录元数据,例如剩余金额

我们正试图将此元数据添加到目录响应中,但在数据库设计上遇到了问题。支持商店是亚马逊的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似乎仍然停留在关系数据库思维中,它将涉及两个DB调用=HTTP请求。但这太奇怪了,我不确定这是个好主意。也许还有第三种方法?我想真正的答案是你应该使用一个文档数据库,但是我们已经非常致力于DynamoDB了-。

表的范围键是什么?我假设散列键是customerId。。。 总的来说,在考虑NoSQL解决方案时,我发现自己在思考我要查询什么 如果您的查询总是查询customerId=XXX的所有项目,那么我认为在那里插入另一个元数据项目是一种糟糕的设计。 更健壮、更浪费的方法是将元数据连接到所有项中,但这本身在更新方面有缺点。我也不推荐 我认为,即使这听起来像是一种关系方法,在您的场景中,我还是会使用另一个表。 此外,通过部分了解您的数据库,我仍然认为在不实际查询用户目录的情况下查询用户的元数据是有意义的