如何将旅行行程数据存储到 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
- 一个
UserTrip
可以包含一天或多天的DayTrip
,例如第 1 天、第 2 天、第 3 天
- 一个
DayTrip
可以有一个或多个景点(Itinerary
)
Itinerary
是描述游览地点的最低级别
将 UserTrip
按原样存储,嵌套 JSON 结构由 DayTrip
,然后 Itinerary
组成,对吧?这意味着特定 UserTrip
的 subTrip
属性将是 JSON 的巨大夹头。所以我认为这里的每个人都会同意这是一个不,不。对吗?
我能想到的另一种选择是只存储每个实体的 ID。我的意思是,例如,UserTrip
的 subTrip
属性包含 DayTrip
id
的列表。这意味着将有另一个 table 来存储 DayTrip
项目,我们可以通过 parentTripId
属性将它连接到相应的 UserTrip
。 Itinerary
.
的列表依此类推
使用这种方法,我将有 3 x tables 如下:
- user-trip-table 存储
UserTrip
其中 subTrip
将包含 DayTrip.id
s 的列表
- user-day-trip-table 存储
DayTrip
,其中 itinerary
将包含 Itinerary.id
的列表。 parentTripId
将使映射回到原来的 UserTrip
- user-itinerary-table 存储
Itinerary
可以通过 dayTripId
属性将其映射回原始 DayTrip
。
我不确定这是否是一个好的做法,因为会发生很多查找并且异步操作在这里是不可能的。这是因为,要获取 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
作为散列键,以便您可以高效地查询它。这样就可以获取用户一次旅行的所有行程对象。
我正在尝试找出将旅行行程数据存储到 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
按原样存储,嵌套 JSON 结构由 DayTrip
,然后 Itinerary
组成,对吧?这意味着特定 UserTrip
的 subTrip
属性将是 JSON 的巨大夹头。所以我认为这里的每个人都会同意这是一个不,不。对吗?
我能想到的另一种选择是只存储每个实体的 ID。我的意思是,例如,UserTrip
的 subTrip
属性包含 DayTrip
id
的列表。这意味着将有另一个 table 来存储 DayTrip
项目,我们可以通过 parentTripId
属性将它连接到相应的 UserTrip
。 Itinerary
.
使用这种方法,我将有 3 x tables 如下:
- user-trip-table 存储
UserTrip
其中subTrip
将包含DayTrip.id
s 的列表
- user-day-trip-table 存储
DayTrip
,其中itinerary
将包含Itinerary.id
的列表。parentTripId
将使映射回到原来的UserTrip
- user-itinerary-table 存储
Itinerary
可以通过dayTripId
属性将其映射回原始DayTrip
。
我不确定这是否是一个好的做法,因为会发生很多查找并且异步操作在这里是不可能的。这是因为,要获取 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
作为散列键,以便您可以高效地查询它。这样就可以获取用户一次旅行的所有行程对象。