【发布时间】: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 结构由DayTrip 和Itinerary 组成,对吧?这意味着特定UserTrip 的subTrip 属性将是一大堆JSON。所以我想这里的每个人都会同意这是一个不,不。对吗?
我能想到的另一种选择是只存储每个实体的 id。我的意思是,例如,UserTrip 的subTrip 属性包含DayTrip id 的列表。这意味着将有另一个表来存储DayTrip 项目,我们可以通过parentTripId 属性将其连接到相应的UserTrip。 Itinerary的列表以此类推。
使用这种方法,我将有 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