0

費用対効果の高いエンティティ設計のチュートリアルはありますか?

小さなサンプルを作成して、 usersgroupsを保存したいとします。これらのグループには、ユーザーのリストがあります。ユーザーがこのグループに参加したい場合は、このグループが存在するかどうか、ユーザーがグループに属していないかどうかを確認する必要があります。

私の質問は、これを行う方法ではありません。問題は、優れたエンティティ設計または優れたオブジェクト化の使用です。

これを行う方法を短縮したサンプルコードを次に示します。

ユーザー.java

@Entity
@Cache
@Embed
public class User {
    @Id Long id;
    @Index String name;
    String passwordHash;
}

Group.java

@Entity
@Cache
public class Group {
    @Id Long id;
    @Index Long groupAdministratorUserId;
    @Index String name;
    List<User> users = new ArrayList<User>();
    @Index Boolean isPublic;
}

使用して

if (!app.authenticate(getRequest(), getResponse())) 
{
    // Not authenticated
    setStatus(Status.CLIENT_ERROR_UNAUTHORIZED);
}
else
{
    Group newGroup = ofy().load().type(Group.class).id(Long.parseLong(id)).now(); // is it correct that the embedded data is already loaded?
    // following check and insert is only for illustration!
    newGroup.getUsers().contains(connectedUser);
    newGroup.getUsers().add(connectedUser);
    ofy().save().entity(newGroup).now();
}

私の「オーバーヘッド」(認証)

public class MyVerifier extends LocalVerifier {
    private User fetched;

    public User getFetched() {
        return fetched;
    }

    @Override
    public char[] getLocalSecret(String identifier) {
        // this is behind search... and another list()
        // User fetched = ofy().load().type(User.class).filter("name", userName).first().now();
        fetched = User.searchByExactName(identifier);
        if (fetched != null)
        {
            return fetched.getPasswordHash().toCharArray();
        }

        return null;
    }
}

PS Google のページを知っています: https://code.google.com/p/objectify-appengine/wiki/BestPractices

しかし、それは私が探しているものではありません

4

1 に答える 1

0

グループ ID のリストをUserエンティティに保存します。使用する必要はありません@Embed。最適なソリューションとは、実際には、アプリケーションで最も一般的な操作が何であるかによって異なります。あなたが言ったことに基づいて、私は次のことをお勧めします:

@Entity
@Cache
public class User {
    @Id long id;
    String name;
    String passwordHash;
    List<Long> groups;
    // constructor left out for brevity.
}

@Entity
@Cache
public class Group {
    @Id long id;
    long adminId;
    String name;
    boolean isPublic;
    // constructor left out for brevity.
}

User user1 = new User(userName1, passwordHash1);
User user2 = new User(userName2, passwordHash2);

Key<User> user1Key = ofy().save().entity(user1).now(); // Create two users.
Key<User> user2Key = ofy().save().entity(user2).now(); // The don't have any groups yet.

long adminId = user1Key.getId();
Group group = new Group(name, adminId, isPublic)
Key<Group> groupKey = ofy().save().entity(group).now(); // Create a group

user2.addToGroup(groupKey.getId()); // This adds the group ID to the User.groups list.
ofy().save().entity(user2).now(); // Add user2 to group.

コストを節約するには (特に、更新中の小規模なデータストア操作で)、できるだけ少ないインデックスを作成するようにしてください。いくつかの es から始めて@Index、必要に応じて追加します。

于 2013-08-08T17:32:15.153 に答える