【问题标题】:How to join tables in dynamoDB?如何在 dynamoDB 中连接表?
【发布时间】:2016-12-28 16:06:51
【问题描述】:

我知道 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 表获取数据

这个实现的问题是它需要很长时间才能完成,1000 个项目超过 5 分钟。

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

dynamodb如何高效实现这一点?

【问题讨论】:

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


【解决方案1】:

【讨论】:

    【解决方案2】:

    您可以尝试使用 dynamodb 的 JDBC 驱动程序,例如 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;
    }
    

    【讨论】:

    • @Tiw 谢谢,我最近开始巧妙地使用 stackoverflow。因为它对所有 IT 人员都非常有用。
    【解决方案3】:

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

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

    您的 Dynamo DB 表如下所示:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 我的问题是如何创建这样的表?
      猜你喜欢
      • 2016-08-13
      • 1970-01-01
      • 2016-03-11
      • 1970-01-01
      • 1970-01-01
      • 2019-06-07
      • 2022-01-25
      • 1970-01-01
      • 2022-11-11
      相关资源
      最近更新 更多