如何将旅行行程数据存储到 DynamoDB 中?

How to store trip itinerary data into DynamoDB?

我正在尝试找出将旅行行程数据存储到 DynamoDB 中的最佳方法。仅供参考,我的代码是用 Python3 编写的,我正在使用 Boto3 与 DynamoDB 交互。

研究此资源后 - https://schema.org/Trip,我认为这就是对象的数据 类。

from marshmallow_dataclass import dataclass
from typing import List, Optional


@dataclass(frozen=True)
class Itinerary:
    id: str
    startTime: int
    endTime: int
    dayTripId: str
    placeName: str
    placeCategory: str
    estimatedCost: float


@dataclass(frozen=True)
class DayTrip:
    id: str
    day: str
    parentTripId: str
    date: Optional[str]
    itinerary: List[Itinerary]


@dataclass(frozen=True)
class UserTrip:
    tripId: str
    userId: str
    tripName: str
    subTrip: List[DayTrip]

本质上,结构如下:

UserTrip 按原样存储,嵌套 JSON 结构由 DayTrip,然后 Itinerary 组成,对吧?这意味着特定 UserTripsubTrip 属性将是 JSON 的巨大夹头。所以我认为这里的每个人都会同意这是一个不,不。对吗?

我能想到的另一种选择是只存储每个实体的 ID。我的意思是,例如,UserTripsubTrip 属性包含 DayTrip id 的列表。这意味着将有另一个 table 来存储 DayTrip 项目,我们可以通过 parentTripId 属性将它连接到相应的 UserTripItinerary.

的列表依此类推

使用这种方法,我将有 3 x tables 如下:

我不确定这是否是一个好的做法,因为会发生很多查找并且异步操作在这里是不可能的。这是因为,要获取 Itinerary,我需要等待 GetItem 操作完成才能获取 UserTrip,然后,我将获得 DayTrip 和然后,我将执行另一个 GetItem 来获取 DayTrip,最后,另一个 GetItem 来获取 Itinerary.

这里的社区能否提出更好、更简单的解决方案?

谢谢!

关于数据结构,我认为 DayTrip 不是绝对必要的,因为您可以从 Itinerary 获取所有数据。所以在 UserTrip 中,我会保留一个行程列表而不是 DayTrips 列表。

It wouldn't be good to store the UserTrip as is, with nested JSON structure consisting of DayTrip, then Itinerary, right? It would mean that the subTrip attribute of a particular UserTrip will be a huge chuck of JSON. So I think everyone here would agree this is a no, no. Is that correct?

其实就是这个is recommended in NoSQL databases,对象中的所有数据denormalised/embedded。您使用了更多存储空间,但避免使用 joins/processing。但请记住 DynamoDB 的项目大小限制(当前为 400KB)。

一般来说,在 NoSQL 中,您需要根据需要的查询创建架构。例如,在您的情况下,您想要获取 UserTrip 的所有行程。只需将 userTripId 添加到 Itinerary table。在 Itinerary 上创建 GSI 使用 userTripId 作为散列键,以便您可以高效地查询它。这样就可以获取用户一次旅行的所有行程对象。