我在Amazon DynamoDB中有一个员工表(即项目)。该表的属性是{employee_id,name,manager_id}
该类使用以下代码在Java中表示:
@DynamoDBTable(tableName = "Employee")
public class Employee {
private String employeeId;
private String name;
private List<Employee> subordinates;
@DynamoDBHashKey
public String getEmployeeId() {
return employeeId;
}
public void setEmployeeId(final String employeeId) {
this.employeeId = employeeId;
}
@DynamoDBAttribute(attributeName = "name")
public String getIntegerAttribute() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Employee> getSubordinates() {
return subordinates;
}
public void setSubordinates(List<Employee> subordinates) {
this.subordinates = subordinates;
}
}
给出以下组织结构图
A
-B
|
--- B1
|
--- B2
-C
|
--- C1
如果我要求员工A,B和C应该加载A的下属.B1和B2应该作为B的下属加载.C1应该作为C的下属加载。
使用Hiberate的@OneToMany注释很容易实现上述功能。什么是在Dynamo中实现这一目标的推荐方法?
谢谢!
答案 0 :(得分:1)
DynamoDB的HashRange架构本身支持一对多。
您可以像这样创建表格:
Subordinate-Table (for storing relationship)
HashKey: EmployeeId (for manager)
RangeKey: EmployeeId (for subordinates)
Employee-Table (for storing employee info)
HashKey: EmployeeId
Attribute: Name
对于您的样本组织结构图,您的从属表将如下所示:
Hash: A Range: B
Hash: A Range: C
Hash: B Range: B1
Hash: B Range: B2
Hash: C Range: C1
要获得经理A的所有子标识,您只需要dynamdob.query(HashKey=="A")
关于直接获取员工数据而无需额外调用Eployee表的问题:您可以将上面的两个表合并到一个表中:
Company-Structure-Table:
HashKey: EmployeeId (manager)
RangeKey: EmployeeId (subordinates)
Attribute: Name (name of the subordinate)
关于避免手动获取管理器下面的所有下属的第二个问题(searchi递归),我的想法是:DynamoDB为您提供了一个数据库原语,您可以在其上构建应用程序。您希望设计模式以使原语非常有效。您可以在DynamoDB之上构建自己的逻辑。递归搜索管理器下面的所有员工是特定于应用程序的逻辑之一。您可以轻松地构建它并将其并行化。我不认为mapper lib包含它。
答案 1 :(得分:0)
@DynamoDBTable(tableName = "Table1")
public class ItemDTO {...}
itemDTO是ItemDTO的实例,代表'Table1'和'Table2'中存在的项目,但itemDTO已更改。现在,我要将这些更改保存在两个表中。
# update of the itemDTO in 'Table1'
mapper.save(itemDTO)
# create TableNameOverride config for 'Table2'
TableNameOverride table2Override = new DynamoDBMapperConfig.TableNameOverride('Table2')
# update of the itemDTO in 'Table2' by passing new DynamoDBMapperConfig w/ table2Override
mapper.save(itemDTO, new DynamoDBMapperConfig(table2Override))