DynamoDB 的用户数据库设计和使用 Cloudsearch 的快速性能搜索
Users database design for DynamoDB and fast performance search with Cloudsearch
我正在研究如何将 DynamoDB 和 Cloudsearch 用于我的应用程序。我不了解有关 DynamoDB 数据库架构的一些事情。考虑到这个模式:
用户table
{
"id_users"(PI): <number>,
"created": <string>,
"email" (GSI): <string>,
"firstname": <string>,
"lastname": <string>
"password"(GSI): <string>,
"verified": <boolean>,
"category": <string>,
"colors": <array of strings>, // list of favourite colors of the users (it's an example)
"locale": <string>,
"user_location": { //GeoJSON structure
"type": <string> ex. "location",
"geometry": {
"type": <string> ex. "Point",
"coordinates": [ <number> ex. 125.6, <number> 10.1]
},
"properties": {
"city": <string>,
"country": <string>
}
},
"accounts": [
{
"type": <string>, // ex. "facebook"
"ID": <number>, // ex. 23248323243473743
"access_token": <string>,
"profile_url": <string>
},
{
"type": <string>, // ex. "google"
"ID": <number>, // ex. 23248323243473743
"access_token": <string>,
"profile_url": <string>
}
]
}
它是完整架构的一部分。
所以,
应用程序的路径是myurl.com/users/{:id_users}
。
我需要搜索半径或国家/地区内的活跃用户 and/or 以及喜欢一种或多种颜色的用户(示例)。我读过我不能在比树的第一个更深的层次中添加索引,并且索引只能是字符串、整数或二进制。此外,Cloudsearch 有更多类型的索引,这非常适合 "colours"
和 "verified"
,但我无法为 "coordinates"
添加 "deep" 索引。
我可以像这样在第一层移动坐标:
location_coordinates: [ <number> ex. 125.6, <number> 10.1],
location_city: <string>,
location_country: <string>,
但它不是 "elegant"。我可以为用户位置创建一个外部 table,但是我可能会失去文档数据库的所有优势,而且当用户访问配置文件时,我不能 retrieve/read 一次调用所有数据。
我必须修改我的数据库模式吗?怎么样?
谁管风雅,我得把坐标放一级?
"coordinates"
项没有索引关联,这对性能有负面影响吗?显然,当我使用地理查询搜索用户时。
有什么建议吗?
感谢您的帮助,
亚历山德罗
您需要使用云搜索来进行搜索。添加所有要搜索的字段作为索引参数,还有 latlon 字段可以帮助进行地理搜索。如果任何文档与您的搜索查询匹配,云搜索将 return 对象的 ID 以及索引字段。从云搜索中检索结果后,您可以使用 id 从 dynamoDB 中获取所需的文档。
Dynamo 和云搜索不会自动相互链接,您需要创建一个单独的云搜索域并确保对 dynamoDB 的任何更新都更新到使用 DynamoStreams 和 Lambda 的云搜索。
不需要深度索引,当对 dynamoDB 文档进行更新时,dynamo 流将调用 lambda 函数。然后 lambda 函数将转换数据并更新云搜索。您可以将您的位置转换为 latlon 字段并在此处更新云搜索以进行地理搜索。
我正在研究如何将 DynamoDB 和 Cloudsearch 用于我的应用程序。我不了解有关 DynamoDB 数据库架构的一些事情。考虑到这个模式:
用户table
{
"id_users"(PI): <number>,
"created": <string>,
"email" (GSI): <string>,
"firstname": <string>,
"lastname": <string>
"password"(GSI): <string>,
"verified": <boolean>,
"category": <string>,
"colors": <array of strings>, // list of favourite colors of the users (it's an example)
"locale": <string>,
"user_location": { //GeoJSON structure
"type": <string> ex. "location",
"geometry": {
"type": <string> ex. "Point",
"coordinates": [ <number> ex. 125.6, <number> 10.1]
},
"properties": {
"city": <string>,
"country": <string>
}
},
"accounts": [
{
"type": <string>, // ex. "facebook"
"ID": <number>, // ex. 23248323243473743
"access_token": <string>,
"profile_url": <string>
},
{
"type": <string>, // ex. "google"
"ID": <number>, // ex. 23248323243473743
"access_token": <string>,
"profile_url": <string>
}
]
}
它是完整架构的一部分。
所以,
应用程序的路径是myurl.com/users/{:id_users}
。
我需要搜索半径或国家/地区内的活跃用户 and/or 以及喜欢一种或多种颜色的用户(示例)。我读过我不能在比树的第一个更深的层次中添加索引,并且索引只能是字符串、整数或二进制。此外,Cloudsearch 有更多类型的索引,这非常适合 "colours"
和 "verified"
,但我无法为 "coordinates"
添加 "deep" 索引。
我可以像这样在第一层移动坐标:
location_coordinates: [ <number> ex. 125.6, <number> 10.1],
location_city: <string>,
location_country: <string>,
但它不是 "elegant"。我可以为用户位置创建一个外部 table,但是我可能会失去文档数据库的所有优势,而且当用户访问配置文件时,我不能 retrieve/read 一次调用所有数据。
我必须修改我的数据库模式吗?怎么样?
谁管风雅,我得把坐标放一级?
"coordinates"
项没有索引关联,这对性能有负面影响吗?显然,当我使用地理查询搜索用户时。
有什么建议吗?
感谢您的帮助, 亚历山德罗
您需要使用云搜索来进行搜索。添加所有要搜索的字段作为索引参数,还有 latlon 字段可以帮助进行地理搜索。如果任何文档与您的搜索查询匹配,云搜索将 return 对象的 ID 以及索引字段。从云搜索中检索结果后,您可以使用 id 从 dynamoDB 中获取所需的文档。
Dynamo 和云搜索不会自动相互链接,您需要创建一个单独的云搜索域并确保对 dynamoDB 的任何更新都更新到使用 DynamoStreams 和 Lambda 的云搜索。
不需要深度索引,当对 dynamoDB 文档进行更新时,dynamo 流将调用 lambda 函数。然后 lambda 函数将转换数据并更新云搜索。您可以将您的位置转换为 latlon 字段并在此处更新云搜索以进行地理搜索。