我正在尝试找出将行程路线数据存储到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结构,对吗?这将意味着特定subTrip
的UserTrip
属性将是JSON的巨大支持。所以我想这里的每个人都会同意这是不,不。正确吗?
我可以想到的另一种选择是只存储每个实体的ID。我的意思是,例如,UserTrip
的subTrip
属性包含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
。
这里的社区可以提出一个更好,更简单的解决方案吗?
谢谢!
关于数据结构,我看不到绝对需要DayTrip
,因为您可以从Itinerary
获取所有数据。因此,在UserTrip
中,我将保留一个行程列表,而不是DayTrips列表。
使用嵌套的JSON原样存储UserTrip并不好由DayTrip和行程组成的结构,对吗?这意味着特定UserTrip的subTrip属性将是巨大的JSON。所以我想这里的每个人都会同意这是不,不。正确吗?
实际上是此is recommended in NoSQL databases,以使所有数据被非规范化/嵌入对象中。您使用更多的存储空间,但避免加入/处理。但是请记住,DynamoDB的项目大小限制(当前为400KB)。
通常,在NoSQL中,您需要根据所需的查询创建模式。例如,对于您的情况,您想获取UserTrip的所有行程。只需将userTripId
添加到Itinerary
表中。在GSI上创建一个Itinerary
使用userTripId
作为哈希键,因此您可以高效地查询它。这样,您将获得用户旅程的所有行程对象。