【问题标题】:DynamoDB modelling advice, duplicating a field for lookupDynamoDB 建模建议,复制一个字段以供查找
【发布时间】:2022-11-30 01:22:15
【问题描述】:

我正在尝试在体育博彩应用程序中建立关系模型。

对于给定的体育比赛,用户可以预测他们认为谁会获胜。 我正在考虑为此应用程序构建登录页面,用户可以在其中查看他们拥有或参与(做出预测)的所有活动矿池。 我的数据模型看起来像这样

因此,例如,我们有一个池 ID a1,由用户 b2 拥有,用户 b1b2 有两个预测。

要获取 a1 拥有的所有活动池很简单,我只需在 OwnerId 上添加一个 GSI 并按 IsActive 进行过滤。

但是,我不确定如何获取 a1 不是其所有者但已对其做出预测的所有活动池。 这里最好的选择是将 IsActive 标志复制到 Predictions 并将 OwnerId 添加到 Predictions,这样我可以先按 OwnerId 获取并按 SK 开始过滤 Prediction 以获取池 ID,然后获取池配置文件通过这些ID?

【问题讨论】:

    标签: amazon-dynamodb data-modeling


    【解决方案1】:

    你没有像那样充分利用PK。

    以下是我将如何设计您所描述的 2 个实体(希望我理解正确)

    水池

    PK                   SK                            Other attributes
    POOL_OWNER#(UserId)  Active#True#POOL_NAME(Or ID)  ...
    

    这样你就可以

    • 获取给定用户的所有池(按分区键查询)
    • 获取给定用户的所有活动/非活动池(查询以“Active =True/False”开头)

    预言

    PK                        SK                                      Prediction attributes
    PREDICTION_USER#(user id) POOL_ACTIVE#True#POOL_NAME#(pool name)  ...
    

    这样你就可以

    • 通过查询 PK 获取用户的所有预测
    • 获取特定池+活动/非活动池的用户的所有预测

    现在,当“停用”池时,您将必须更新所有条目。如果您担心数据一致性,您可以使用事务,但请记住它们有 25 个项目的限制(但他们最近upped该数字为 100)

    如果你需要得到一个池的所有预测,你可以为它添加一个 GSI

    GSI1PK                           GSI1SK
    PREDICTION_POOL_NAME#(pool name) PREDICTION_USER#(user id)
    

    将要使用的数据直接放入 PK 或 SK 中并不是一个好主意。例如,如果您需要 UserID,不要从 SK 中提取它,而是有一个单独的属性 UserId,这样更改和重载 PK 和 SK 就容易得多

    【讨论】:

    • 谢谢@borislav,我不确定这种 PK 选择是否适合我,对于我的登录页面,我想查询用户拥有或正在参与的所有活动池(尚未结束的游戏)(有预测)无论池类型如何。我不认为在泳池类型上进行 PK 对我有帮助吗?
    • 那么OK,第一个PK可以变成POOL_OWNER#(UserId)。获取用户拥有的所有池 -> 按分区键查询(POOL_OWNER),获取用户参与的所有池 -> 按分区键查询(PREDICTION_USER)。您将不得不进行 2 次查询,但似乎有效?
    • 谢谢,但如果我按 Prediction_User 过滤,我将无法从该查询中知道哪些池 ID 处于活动状态?
    • 我懂了。然后您可以在两个地方复制活动标志。这会让你的写作有点困难,但有时在处理 NoSQL 时这是必要的。查看我更新的答案
    • 好的,太好了,谢谢,是的,这基本上就是我猜测我在原始答案中需要做的事情。在这里似乎是不可避免的,实际上,在使用 NoSQL 时有时是必要的。
    猜你喜欢
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    相关资源
    最近更新 更多