首页 > 解决方案 > 构建我的 NoSQL 数据库的两种不同方法 < 选择什么?

问题描述

我目前开始使用 DynamoDB,但我对应该选择的结构有疑问。

我设置 Twilio 以便能够接收餐厅客人的 WhatsApp 消息。客人可以将他们的反馈直接发送到我的 Twilio WhatsApp 号码。我通过 webhook 收到反馈并将其保存在 DynamoDB 中。餐厅经理获得一个仪表板(React 应用程序),他可以在其中查看监控反馈。虽然我从一家餐厅/一个 WhatsApp 号码开始,但随着时间的推移,我会添加更多用户/餐厅。

现在我想到了以下两种结构之一。有了第一个想法,当客人向餐厅发送新消息时,我总是会创建一个新项目。

有了第二个想法,我会(大部分时间)更新现有条目。仅当接收者/餐厅尚不存在时,才会创建新项目。发送给该餐厅的所有其他消息只会更新现有项目。

你对最好的前进方式有什么建议吗?

第一个想法: PK(主键)、Created(Epoc 时间)、Receiver/Restaurant(电话号码)、Sender/Guest(电话号码)、Body(字符串)

样本数据:

1, 1574290885, 4917123525993, 4916034325342, "Example Message 1"  # Restaurant McDonalds (4917123525993)
2, 1574291036, 4917123525993, 4917542358273, "Example Message 2"  # different sender (4917542358273)
3, 1574291044, 4917123525993, 4916034325342, "Example Message 3"  # same sender as pk 1 (4916034325342)
4, 1574291044, 4913423525123, 4916034325342, "Example Message 4"  # Restaurant Burger King (4913423525123)

第二个想法:

{
    Receiver (primary key),
    Messages: {
        {
            id,
            Created,
            From,
            Body
        }
    }
}

样本数据(与第一个想法相同的数据,但结构不同):

{
    Receiver: 4917123525993,
    Messages: {
        {
            Created: 1574290885,
            Sender: 4916034325342,
            Body: "Example Message 1"
        },
        {
            Created: 1574291036,
            Sender: 4917542358273,
            Body: "Example Message 2"
        },
        {   
            Created: 1574291044,
            Sender: 4916034325342,
            Body: "Example Message 3"
        }
    }
}

{
    Receiver: 4913423525123,
    Messages: {
        {
            Created: 1574291044,
            Sender: 4916034325342,
            Body: "Example Message 4"
        }
    }
}

标签: nosqlamazon-dynamodb

解决方案


在一条记录中存储多条消息有多个问题

  1. 随着我们的进行,写入数据库的大小会增加。(这将转化为金钱和响应时间,最坏的情况是您最终可能会达到 400kb 的限制。)

  2. 多次写入之间的竞争条件。

  3. 无法按用户和其他模式聚合消息。

更糟糕的是,我看不到将多条消息存储在一起的任何好处。(除了可能我可以一起查询所有这些,这将随着大小的增长而成为一个骗局,就像你将无法让我获得最后 10 条评论,你将始终必须获取所有评论然后再获取最后 10 条评论。)

因此,选择所有消息都以不同方式存储的选项。


推荐阅读