【问题标题】:How to store trip itinerary data into DynamoDB?如何将旅行行程数据存储到 DynamoDB 中?
【发布时间】:2020-05-30 20:10:15
【问题描述】:

我正在尝试找出将旅行行程数据存储到 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]

本质上,结构如下:

  • 一个人可以有多个UserTrips
  • UserTrip 可以包含一天或多天的DayTrip,例如第 1 天、第 2 天、第 3 天
  • DayTrip 可以访问一个或多个地方 (Itinerary)
  • Itinerary 是描述游览地点的最低级别

按原样存储UserTrip 并不好,嵌套的JSON 结构由DayTripItinerary 组成,对吧?这意味着特定UserTripsubTrip 属性将是一大堆JSON。所以我想这里的每个人都会同意这是一个不,不。对吗?

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

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

  • 用于存储UserTrip 的用户行程表,其中subTrip 将包含DayTrip.ids 的列表
  • user-day-trip-table 存储DayTrip,其中itinerary 将包含Itinerary.ids 的列表。 parentTripId 将启用映射回原始 UserTrip
  • user-itinerary-table 存储Itinerary,可以通过dayTripId 属性映射回原始DayTrip

我不确定这是否是一个好习惯,因为会发生很多查找并且异步操作在这里是不可能的。这是因为,要获取Itinerary,我需要等待GetItem 操作完成才能获取UserTrip,然后,我将拥有DayTrip 的ID,然后,我将再做一个@987654357 @ 获取DayTrip,然后,最后,另一个GetItem 获取Itinerary

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

谢谢!

【问题讨论】:

    标签: database database-design amazon-dynamodb schema data-modeling


    【解决方案1】:

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

    使用嵌套的 JSON 按原样存储 UserTrip 并不好 结构由 DayTrip 和 Itinerary 组成,对吗?这意味着 特定 UserTrip 的 subTrip 属性将是一个巨大的 JSON的夹头。所以我想这里的每个人都会同意这是一个不,不。 对吗?

    实际上这个is recommended in NoSQL databases,将所有数据非规范化/嵌入到对象中。您使用更多存储空间,但避免连接/处理。但请记住 DynamoDB 的项目大小限制(当前为 400KB)。

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

    【讨论】:

    • 有趣。我一直在使用 DynamoDB,但从未花时间阅读基础知识。 :|顺便说一句,行程所在的那一天呢?在每个行程对象中都有 day 属性而不是将它们分组在 day 属性下是否很好?
    • 今天我认为你可以从startTime 和/或endTime 中推断出它。如果您需要它进行查询,请设置为Itinerary 中的day 字段。
    • 也不需要在UserTrip中存储subTrip: List[DayTrip],可以通过userTryId查询行程获取
    • 你建议有 2 x 表吗?一个存储Itinerary 对象,另一个存储UserTrip 对象?所以在UserTrip 中,我什至不需要subTripList[Itineraries],因为一旦我拥有tripId,我可以通过tripId 并行查询两个表,因为我添加了tripIdItinerary 数据类?
    • 是的。您甚至可以将 userId 和 tripName 添加到每个行程中。这样,您将只有 1 张桌子。但我猜这两张表是最好的解决方案
    猜你喜欢
    • 2023-03-04
    • 2020-06-20
    • 2019-08-27
    • 2021-03-11
    • 2022-11-17
    • 2018-09-30
    • 2013-02-06
    • 1970-01-01
    • 2018-11-02
    相关资源
    最近更新 更多