【发布时间】:2020-04-18 12:50:35
【问题描述】:
为了更好地理解如何设计单个 DynamoDB 表,我尝试开发一个小型电影数据库应用程序。
这是我当前的 DynamoDB 表设计:
╔══════════╦════════════╦═══════════════╗
║ PK ║ SK ║ Title ║
╠══════════╬════════════╬═══════════════╣
║ pk_1 ║ movie ║ Die Hard ║
║ pk_1 ║ actor_pk_3 ║ Bruce Willis ║
║ pk_1 ║ tag_pk5 ║ Action ║
║ ║ ║ ║
║ pk_2 ║ movie ║ Looper ║
║ pk_2 ║ actor_pk_3 ║ Bruce Willis ║
║ pk_2 ║ actor_pk_4 ║ Emily Blunt ║
║ pk_2 ║ tag_pk5 ║ Action ║
║ ║ ║ ║
║ pk_3 ║ actor ║ Bruce Willis ║
║ pk_3 ║ movie_pk_1 ║ Die Hard ║
║ pk_3 ║ movie_pk_2 ║ Looper ║
║ ║ ║ ║
║ pk_4 ║ actor ║ Emily Blunt ║
║ pk_4 ║ movie_pk_2 ║ Looper ║
║ ║ ║ ║
║ pk_5 ║ tag ║ Action ║
║ pk_5 ║ movie_pk_1 ║ Die Hard ║
║ pk_5 ║ movie_pk_2 ║ Looper ║
╚══════════╩════════════╩═══════════════╝
* The table has one GSI, it is just the PK and SK reversed.
我尝试设计数据库,以便始终可以通过一次查询(单次往返)获得所需的所有数据。 该设计有效,目前满足我想要的大多数访问模式。
一些例子:
- 如果我想要电影“虎胆龙威”的所有内容,我只想查询 普通表上的“pk_1”。
- 如果我想要所有电影,我会使用以下命令查询 GSI “电影”
- 如果我想要电影“虎胆龙威”的所有演员,我查询“pk_1” 并且 SK 以“actor”开头
- ...等等
这是我的大问题:
- 这是一个好的 DynamoDB 表设计还是错误/坏的?
如果表格设计还不错,这些是我的后续问题:
重复数据正常吗,我应该这样做吗?
有这么多业务逻辑获取、插入和更新数据是否正常?
“安全”插入数据的最佳方式是什么? 先加电影,再加“actor_”和“tag_”,感觉不对,一定会失败
如何确保重复数据始终与“主数据”保持一致?
如何处理可能包含数百万条目的关系更新? 例如,如果我将标签“Action”重命名为“ACTION”,我将不得不用这个标签更新每部电影。 目前我只看到我批量更新它,所以数据在一定时间内并不一致。
目前我怀疑我在这张表上所做的每一个决定,因为它只是感觉来自关系数据库是错误的......
【问题讨论】:
-
这里有一个类似的问题,针对不同的数据模型,通过一些额外的资源得到了相当彻底的答案。我不回答您的具体问题,但您可能会发现有助于理解单表策略。 stackoverflow.com/q/51055657/5563569
标签: amazon-dynamodb dynamodb-queries