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

问题描述 投票:0回答:1

我正在尝试找出将行程路线数据存储到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
  • UserTrip可以由DayTrip的一天或多天组成,例如第1天,第2天,第3天
  • DayTrip可以有一个或多个景点(Itinerary
  • Itinerary是描述游览地点的最低级别

按原样存储UserTrip并使用由DayTrip然后是Itinerary组成的嵌套JSON结构,对吗?这将意味着特定subTripUserTrip属性将是JSON的巨大支持。所以我想这里的每个人都会同意这是不,不。正确吗?

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

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

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

我不确定这是否是一个好习惯,因为会发生很多查找,并且此处无法进行异步操作。这是因为要获取Itinerary,我需要等待GetItem操作完成才能获取UserTrip,然后,我将拥有DayTrip的ID,然后,我将执行另一个GetItem ]来获取DayTrip,最后,另一个GetItem来获取Itinerary

这里的社区可以提出一个更好,更简单的解决方案吗?

谢谢!

database database-design amazon-dynamodb schema data-modeling
1个回答
1
投票

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

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

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

通常,在NoSQL中,您需要根据所需的查询创建模式。例如,对于您的情况,您想获取UserTrip的所有行程。只需将userTripId添加到Itinerary表中。在GSI上创建一个Itinerary使用userTripId作为哈希键,因此您可以高效地查询它。这样,您将获得用户旅程的所有行程对象。

© www.soinside.com 2019 - 2024. All rights reserved.