我对Aerospike DB和二级索引有疑问。
我有一组学生,每个学生(记录密钥是StudentId),
有一个地图(bin),由<CourseId ,Grade>
组成。
我想只选择参加特定课程的学生。 我该怎么做 ? 我应该在地图上添加二次索引吗?使用UDF?
感谢。
答案 0 :(得分:3)
您可以使用两种方法 - 一种使用二级索引,一种不使用(只使用主索引进行键值操作)。
没有辅助索引
让我们假设你的应用程序有三种类型,每种类型都在Aerospike中设置 - courses
,students
,roster
。课程对象包含有关课程的信息,学生对象保存有关学生的信息。
roster
对象具有与课程相同的键,或者可能是复合 courseID | semester 。该课程应该有一个bin 学生,其中包含学生ID列表。要获得课程的学生,您将获得roster
记录,然后将其学生键列表转换为针对students
的单个批量阅读操作。
当然你也可以折叠它,只有两套 - courses
和students
,并将课程学生列表保留为课程对象中的bin。这里不需要多对一加入,因为您可以使用list和map复杂data types。
如果您想在没有辅助索引的情况下执行更复杂的查询,可以将predicate filter应用于courses
集的扫描(请参阅使用Java客户端的example方式)。
使用辅助索引
您可以在学生对象中添加bin in ,其值为课程ID列表(这意味着您可以轻松地从ID中获取课程对象)。您可以构建secondary index over that list课程ID。要获得学生的课程,您可以通过其键获取学生对象,并查看课程中 bin。要让所有学生参加特定课程,请在students
集合中的记录区域上运行二级索引查询。
您可以对此辅助索引查询找到的记录应用谓词过滤器,以便按其他条件进一步过滤学生。