为不同的排序查询建模NoSQL数据库(DynamoDB)

时间:2012-06-02 02:10:38

标签: database-design amazon-web-services nosql amazon-dynamodb non-relational-database

关于如何建模DynamoDB表,我有一些特定的问题,以便我可以处理必要的查询。

我的应用程序集中在“事件”的概念上。每个活动都有属性(姓名,地点,时间,与会者人数等)。事件与它们所在的城市相关联。我试图弄清楚如何执行获取/查询请求(可能是一系列获取/查询请求)以获得特定城市中参与者最多的前25个事件。

我来自关系数据库的背景,这将是一个非常简单的查询(从参与者限制25的城市= x顺序的事件中选择*)。但我很难弄清楚如何使用非关系数据库来做同样的事情。我知道我将不得不创建额外的表来存储哈希的映射,但我似乎无法弄明白。

我想到实现它的一种方法是以某种方式让“参与者”(数字类型)成为范围键,并让城市成为哈希键。但这不一定是唯一的密钥,因为同一城市中的多个事件可以具有相同数量的与会者。此外,甚至可以“更新/原子地增加”范围键吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

注意:我仍然相信RDBMS更适合这些查询,但这里有:

首先,您只能以原子方式递增属性 现在,根据您的情况,我建议如下:

Table: Events
hk: eventId
attributes

Table: Top_Attendees_Per_City
hk: city
rk: eventId

Table: Event_Id_Generator
hk: event_counter
running_counter

Table: Minimum_Attendees_Per_City
hk: city
min_attendees_number, max_attendees_number, events_number

一旦事件触发到您的后端,您将需要为其分配一个正在运行的ID。这不是强制性的,它存在扩展问题,但它将确保如果事件的参与者数量相同,则较新的事件将优先于您的" top25"。您需要检查是否参与人数在最小值和最大值之间,同时计算事件直到" 25"。这使您的mimimum_attendees_per_city可以决定此新事件是否会出现在top25中。如果是,则将其添加到top_attendees_per_city 最后,使用setScanIndexForward(false)和setLimit(25)来查询该表,结果是25个具有最多与会者的事件。 最后注意事项:结果项目不是由与会者订购的,您可以在返回之前在应用程序级别订购它们。