【发布时间】:2018-01-27 22:37:40
【问题描述】:
我对 Aerospike DB 和二级索引有疑问。
我有一组学生,每个学生(记录键是 StudentId),
有一个地图 (bin) ,由 <CourseId ,Grade> 组成。
我只想选择参加过特定课程 IDs 的学生。 我该怎么做 ? 我应该在地图上添加二级索引吗?使用 UDF?
谢谢。
【问题讨论】:
-
",包含 ." - 由什么组成?
我对 Aerospike DB 和二级索引有疑问。
我有一组学生,每个学生(记录键是 StudentId),
有一个地图 (bin) ,由 <CourseId ,Grade> 组成。
我只想选择参加过特定课程 IDs 的学生。 我该怎么做 ? 我应该在地图上添加二级索引吗?使用 UDF?
谢谢。
【问题讨论】:
您可以使用两种方法 - 一种使用二级索引,另一种不使用(仅使用主索引的键值操作)。
没有二级索引
我们实际上假设您的应用程序中有三种类型,每种类型在 Aerospike 中都有自己的集合 - courses、students、roster。课程对象保存有关课程的信息,学生对象保存有关学生的信息。
roster 对象与课程具有相同的键,或者可能是复合courseID|semester。该课程应该有一个 bin students,其中包含学生 ID 列表。要获取课程的学生,您需要获取 roster 记录,然后将其学生键列表转换为针对 students 的单个批量读取操作。
当然,您也可以将其折叠并只设置两组 - courses 和 students,并将课程学生列表作为课程对象中的 bin。此处无需多对一连接,因为您可以使用 list 和 map 复合体 data types。
如果您想在没有二级索引的情况下执行更复杂的查询,可以将predicate filter 应用于courses 集的扫描(参见example 以这种方式使用Java 客户端)。
带有二级索引
您可以向学生对象添加一个 binin-course,其值为课程 ID 列表(这意味着您可以轻松地从 ID 中获取课程对象)。你可以建立一个secondary index over that list当然的ID。要获取学生的课程,您可以通过键获取学生对象,然后查看 in-course 箱。要获取特定课程的所有学生,请对 students 集中的记录箱运行二级索引查询。
您可以对该二级索引查询找到的记录应用谓词过滤器,以进一步按其他条件过滤学生。
【讨论】: