我知道DynamoDB不支持连接表,但这里是我的用例:
(使用类似的例子隐藏确切的细节,不张贴家庭作业问题)
我有四张表
Person ( unique_id(hash key), Name(range key), Age, Gender)<br>
UIDtoSIDTable ( uid(hash key) , sid)<br>
SIDtoStudentID(sid(hash key), studentID, other attributes)<br>
StudentDetails(studentID(hash key), schoolName, Grades)
我正在使用dynamodbmapper。
我的应用程序需要在表中显示以下数据:
unique_id, Name, Age (from Person table)
sid
SchoolName, Grades (from studentDetails table)
现在我的实现是:
- 扫描uidtosidTable列表中所有id-sid对
- 对于list1中的每个sid,从sidtostudententid表 中查询studententid
- 从Person表中获取每个uid查询,并且从StudentDetails表 获取每个studentID的数据
这个实现的问题是需要很长时间才能完成,1000个项目需要5分钟以上。
如果它是一个关系数据库,我将连接这四个表,并获得所需的数据。
如何有效地实现这一点?
DynamoDB不支持在服务端连接表。您想要加入的任何操作都必须在客户端完成。
如果可能的话,您应该重新考虑您的表设计,将所有需要的信息包含在一个表中的单个记录中,而不是您拥有的4个表。
你的Dynamo DB表看起来像这样:
unique_id, Name, Age, Gender, studentID, schoolName, Grades, other attributes
如果这是不可能的,那么你唯一的选择是尝试在内存中执行连接与全表扫描与索引和查询的组合。例如,您可以创建一个全局辅助索引(Global Secondary Index, GSI)来完成SID到UID的反向映射。然后,您可以使用查询而不是扫描来执行连接—尽管连接仍将在客户端执行。
您可以尝试为dynamodb使用JDBC驱动程序,例如cdata JDBC驱动程序。我在我的一个项目中使用了它,它可以很好地连接表和聚合函数。唯一的事情是,在我的情况下,我使用连接与非常少的数据表(最多1000条记录)。对于庞大的数据,您可能需要检查是否有任何性能影响。
对于下面的代码,您必须注册Cdata并下载Cdata JDBC驱动程序。以下是Cdata web url,在这里输入链接描述private String getLastRecordDate(DbServer dbserver, String area){
String lastRecordDate="";
Connection conn =null;
try{
conn = DriverManager.getConnection("jdbc:dynamodb:Other='threadcount=1';Verbosity=2;AccessKey=abcdefgc;SecretKey=acddasdd;Domain=amazonaws.com;Region=mumbai;");
Statement stat = conn.createStatement();
boolean ret = stat.execute("select employee_name,project_name from employee e left join project p on e.project_id=p.id ");
ResultSet rs=stat.getResultSet();
if(rs.next()){
rs.getString("employee_name");
rs.getString("project_name");
}
rs.close();
conn.close();
}catch(Exception ex){
ex.printStackTrace();
log.info(ex.toString());
}finally {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {}
}
}
return lastRecordDate;
}
您可以使用单个表完成此操作。表中的每一行都可以包含该人的唯一ID、姓名、年龄、性别、学生号、学校名称和一组成绩。
您可以使用HiveQL,它也提供聚合函数。
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/EMRforDynamoDB.Querying.html