0

是否有经济高效的实体设计教程?

如果我做一个小样本并说我想存储用户。这些组有一个用户列表。如果任何用户想加入这个组,我必须检查这个组是否存在并且用户不是该组的一部分。

我的问题不是如何做到这一点。问题在于良好的实体设计或良好的对象化使用。

这是一些缩短的示例代码,我将如何做到这一点:

用户.java

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

组.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我知道谷歌的页面:https ://code.google.com/p/objectify-appengine/wiki/BestPractices

但这不是我要寻找的

4

1 回答 1

0

我将存储User实体的组 ID 列表。无需使用@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.

为了节省成本(特别是更新期间的小型数据存储操作),请确保创建尽可能少的索引。从几个@Indexes 开始,并根据需要添加它们。

于 2013-08-08T17:32:15.153 回答