1

Предположим, моя модель хранилищу выглядит следующим образом:Когда вы храните идентификаторы и когда вы храните ключи в gae datastore?

@Entity 
public class User { 

    @Id 
    private Long id; 
    @Index 
    private String email; 
    private Long dateOfBirth; 
    // More fields... 
} 

@Entity 
public class Topic { 

    @Id 
    private Long id; 
    private String topicTitle; 
    private Long date; 

} 

@Entity 
public class Comment { 

    @Id 
    private Long id; 
    @Parent 
    private Key<Topic> topicKey; 
    private Long commenterId; 
    private String text; 
    private Long date; 

} 

Если объект Комментарий имеет родительский объект Тема. Я знаю, что нужно хранить ключи при указании @Parent, например, я сделал в объекте Comment, но должен также хранить ключ commenterId? Или достаточно хранить идентификатор Long этого Пользователя?

Просто интересно, что лучше всего подходит для хранения ссылок на другие объекты, если они не являются родителями - следует хранить идентификатор и генерировать ключ позже или просто хранить ключ для объекта. Есть ли веская причина, почему вы можете сделать это над другим?

EDIT: Поскольку я использую Cloud Endpoints, ответы, которые я получаю от моего проекта AppEngine, это JSON. Параметрированный тип ключа не разрешен в клиентских библиотеках. Так что для меня id может работать, а также Key<?> может работать. Сразу отметит, что вы должны вернуть версию websafe от вашего клиента с помощью:

myKey.getString(); 

ответ

1

Обычно нет оснований хранить ключ в качестве ссылки. Ключи занимают гораздо больше места - как в хранилище данных, так и в объектах, которые вы передаете клиенту и обратно.

Использование ключа может потребоваться только в том случае, если один и тот же вид сущности может быть либо сам по себе, либо дочерним элементом другого объекта. Это технически возможно, и некоторые модели данных могут использовать этот подход, хотя, вероятно, это очень редкий случай использования.

NB: Я использую только идентификатор родителя в объектах - по той же причине (меньше места). В объектах хранилища данных родительский идентификатор всегда можно извлечь из ключа дочернего объекта. Однако я использую API Datastore низкого уровня, но вам нужно проверить, как правильно аннотировать отношения между родителями и родителями в используемой библиотеке.

+0

Благодарим за отзыв! Я использую движок Google для работы с Google, и в моем примере выше показано, что GAE может делать только то, что вы сказали: извлекает родительский идентификатор из дочернего сущностного ключа, когда он хранит объекты. – Micro

+0

Еще один вопрос на стороне примечания. Для ваших различных методов API вы предпочитаете использовать Entity в качестве параметра и получить его идентификатор внутри метода API или просто передать соответствующий идентификатор в качестве параметра? Например, вы бы сделали что-то вроде 'insertComment (User user, Comment comment)' или 'insertComment (@Named (" userId ") Long userId, комментарий к комментарию)'? – Micro

+1

Это зависит :) Если мне нужна дополнительная информация от этого сущности, и у меня уже есть это, я передам его. Если у меня его еще нет, я передам идентификатор и верну его внутри метода. –