2015-03-16 4 views
0

У меня есть таблица сотрудников (т. Е. Элемент) в Amazon DynamoDB. Атрибуты этой таблицы являются {employee_id, имя, manager_id}DynamoDBMapper Аннотации. Отображение OneToMany

Класс представлен в 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; 
    } 
} 

Учитывая следующий Org Chart

A 
-B 
| 
    --- B1 
| 
    --- B2 
-C 
| 
    --- C1 

Если я прошу сотрудника А, B и C должны быть загружены подчиненные A. B1 и B2 должны быть загружены в качестве подчиненных B. C1 должны быть загружены в качестве подчиненного C.

Вышеуказанная функциональность легко получить, используя аннотацию @OneToMany от Hiberate. Каков рекомендуемый способ достижения этого в «Динамо»?

Спасибо!

+0

Что вы подразумеваете под '@ OneToMany' в терминах Dynamo? Вы ожидаете, что эти элементы будут сопоставляться с объектами в других таблицах или вам просто нужно поведение «Карта»? – mkobit

+0

И «Map» Я имею в виду вложенные атрибуты карты. – mkobit

+0

Привет, Майк. Я ожидаю, что поля классов будут отображаться на объекты в других таблицах (как и у меня). То есть я не хочу подчиняться идентификаторам сотрудников, я хочу подчиненных сотрудников. – user544192

ответ

1

От одного до многих поддерживается схема HashRange DynamoDB.

Вы можете создать таблицу, как это:

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 

Чтобы получить все subordiates менеджера А, вы просто нужно сделать dynamdob.query(HashKey=="A")

Что касается вашего вопроса о получении данных о сотрудниках напрямую без дополнительного вызова таблицы Eployee: вы можете объединить две таблицы выше в одну таблицу:

Company-Structure-Table: 
HashKey: EmployeeId (manager) 
RangeKey: EmployeeId (subordinates) 
Attribute: Name (name of the subordinate) 

Что касается второго вопроса о избегая вручную получать все подчиненные ниже менеджера (searchi рекурсивно), вот моя мысль: DynamoDB дает базу данных примитив, что вы можете создать приложение на Верх. Вы хотите создать свою схему, чтобы сделать примитив очень эффективным. Вы можете построить свою собственную логику поверх DynamoDB. Рекурсивный поиск всех сотрудников под менеджером является одной из тех приложений, для которых характерна логика. Вы можете легко построить его и распараллелить. Я не думаю, что в него входит сборщик lib.

+0

Привет, Erben. Ваше решение состоит в том, чтобы запросить таблицу подчиненных с помощью идентификатора manger (A в этом примере), чтобы получить подчиненные идентификаторы сотрудников, а затем искать подчиненных в таблице employee. Как насчет подчиненных орбит. Это много ручной работы, которую я бы хотел избежать. Мне интересно, есть ли способ моделирования отношений сущностей в Dynamo так, как это делает Hibernate. то есть можно улучшить DynamoDBMapper для достижения того, о чем я говорю. – user544192

+0

@ user544192 см. Обновленный ответ –

+0

, просто подтверждающий, что эта функциональность в настоящее время не встроена в DynamoDBMapper –