由于DynamoDB现在支持JSON文档(地图类型)和对文档的投影,将地图存储为一个属性与将字段存储为单独属性之间是否存在性能或成本差异?
例如,我有一个用于访问不同站点的API的表。大多数人使用client_id
和client_secret
,有些人使用其他字段,例如server_token
,还有一些人使用其他字段。使用单个地图属性或多个属性存储项目有区别吗?
id | name | data
———————————————————————————————————————————————————————————————————————
1 | Google | {client_id: XXX, client_secret: XXX}
2 | Uber | {client_id: XXX, client_secret: XXX, server_token: XXX}
与
id | name | client_id | client_secret
————————————————————————————————————————
1 | Google | XXX | XXX
========================================
id | name | client_id | client_secret | server_token
—————————————————————————————————————————————————————
2 | Uber | XXX | XXX | XXX
答案 0 :(得分:2)
在性能或成本方面,使用顶级属性与在data
属性下嵌套它们之间不应该有任何区别。
但是,截至今天,DyanmoDB不支持在嵌套属性上创建二级索引。假设您将来需要通过client_id
查询此表,如果您嵌套该属性,那么您将无法在该属性上添加全局二级索引。
答案 1 :(得分:0)
考虑模型的可扩展性:将数据存储为多个属性,即使在分布式客户端方案中,也可以轻松地原子地更新数据。
如果将数据存储为地图,则每次要更新该地图内的任何值时,都必须重新编写整个地图。如果有许多分布式客户端试图同时修改同一张图上的不同键,那将是一场噩梦。