我们目前正在建立一个新的应用程序,到目前为止,该应用程序大多数都是无服务器的。现在,我们正在考虑将DynamoDB用于我们的后端(因为它快速,“新颖”且富有光泽),因此,我试图围绕如何转换我们的关系模型以设计一个好的DynamoDB模式进行思考。 / p>
一个非常简化的示例是:我们的商店具有不同的属性(例如地址等),并且我们还具有通过其用户名和其他属性唯一标识的用户,这些用户可以访问商店的信息。 / p>
我感兴趣的用例是: 我想用一个用户名查询并获取他有权访问的所有商店,包括其属性,即地址。
尝试1:
PK | SK | info_data
-----------------------------------------------------------------------
store1 | store1 | { address: ABC street, 12345 Anywhere }
store2 | store2 | { address: XYZ street, 54321 Somewhere }
user1 | user1 | { name: Mr. Nobody }
user2 | user2 | { name: Mr. Anybody }
user1 | store1 | {}
user2 | store1 | {}
user2 | store2 | {}
我在这里用用户名查询并获取他有权访问的所有商店,但是随后,我必须再次查询每个商店以获取信息。
尝试2:
PK | SK | info_data
-----------------------------------------------------------------------
user1 | user1 | { name: Mr. Nobody }
user2 | user2 | { name: Mr. Anybody }
user1 | store1 | { address: ABC street, 12345 Anywhere }
user2 | store1 | { address: ABC street, 12345 Anywhere }
user2 | store2 | { address: XYZ street, 54321 Somewhere }
在这里,我使用用户名进行查询,并获得他有权访问的所有商店,并在同一查询中包含有关商店的信息。但是我到处都有重复的数据。 因此,当我更改商店的地址时,我必须遍历该商店的所有情况以进行更改。当然,可以通过新的全局索引简化此操作,但是我仍然必须这样做。
因为我对此并不陌生,所以我正在考虑在这里缺少一些必不可少的东西。对于示例问题,并结合实际数据中存在的其他一些这样的关系,层次结构等,还不错吗?我想知道关系数据库是否会更适合?我真的很想完成这项工作,只是我不知道是否不可能/不可行,或者我只是坚持不放弃:)
答案 0 :(得分:1)
第一件事:非关系型数据库最适合大量的传入数据,它们的开发可以快速写入内容,我认为它最不适合您的特定用例。
您应该考虑使用和RDS数据库一起使用的Aurora DB(在没有自定义的情况下已经具有出色的性能)。在创建数据库时,请选择“ IOPS优化”类型,以达到最大的读写速度。这样,您的数据库性能将比Dynamo更好,并且可以保留您的实际结构。
现在回答您的问题: 值(列)可以是标量,映射或数组。如果一个用户可以拥有多个商店,则假设您不使用链接,而无需进行嵌入和非规范化路线,则可以在每个用户中(或相反)存储一个Arrayof商店名称。 喜欢:
{
User: “Mr. Nobody”,
Shops: [
{ address: ABC street, 12345 Anywhere },
{ address: AC street, 12345 Anywhere },
{ address: BC street, 12345 Anywhere }
]
}
答案 1 :(得分:1)
DynamoDB的要点不仅在于它是非关系数据库,而且每个表都是AWS云中的独立资源。 我已经使用DynamoDB启动了一个项目,但是移到了MongoDB。原因是:
我认为,如果您需要在数据库中保留大量数据,但没有整个数据库的管理和结构,那将是一个很好的解决方案。
对于您的情况,我建议使用AuroraDB吗?