如何在dynamoDB中连接表?

时间:2016-08-22 07:44:38

标签: java amazon-web-services amazon-dynamodb nosql

我知道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)

现在我的实施是:

  1. 扫描uidtosidTable,列表中的所有uid-sid对说list1
  2. 对于list1中的每个sid,从SIDtoStudentID表中查询studentID
  3. 来自Person表的每个uid查询,以及每个studentID从StudentDetails表中获取数据
  4. 这个实现的问题是需要很长时间才能完成,超过5分钟可以完成1000个项目。

    如果它是一个关系数据库,我会加入这四个表,并获得所需的数据。

    如何有效地实现这一目标?

4 个答案:

答案 0 :(得分:5)

DynamoDB不支持在服务端连接表。您可能希望做的任何加入都必须在客户端完成。

如果可能,您应该重新访问您的表格设计,将所有需要的信息包含在一个表格中的单个记录中,而不是您拥有的4个表格中。

您的Dynamo数据库表格如下所示:

unique_id, Name, Age, Gender, studentID, schoolName, Grades, other attributes

如果无法做到这一点,那么您唯一的选择是尝试使用索引和查询的全表扫描组合在内存中执行连接。例如,您可以创建全局二级索引(GSI)以便能够对SID执行反向映射到UID。然后,您可以使用查询而不是扫描来执行加入 - 尽管加入仍将在客户端执行。

答案 1 :(得分:1)

您可以尝试将JDBC驱动程序用于dynamodb,例如cdata jdbc驱动程序。我在一个项目中使用了它,它可以很好地用于连接表以及聚合函数。在我的情况下,唯一的事情是我联接了数据量非常少的表(最多1000条记录)。对于海量数据,您可能必须检查是否对性能有影响。

对于以下代码,您已经向Cdata注册并下载了Cdata JDBC驱动程序。以下是Cdata网站网址enter link description here

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;
}

答案 2 :(得分:0)

您可以使用单个表来完成此操作。表格中的每一行都可以包含此人的唯一ID,姓名,年龄,性别,学生ID,学校名称和成绩集合。

答案 3 :(得分:-1)

如果要在DynamoDB表上执行联接,则可以将DynamoDB表加载到Rockset中。 Rockset提供了SQL接口,可跨多个表运行查询。请参阅此博客以了解更多信息:

https://rockset.com/blog/running-fast-sql-on-dynamodb-tables/