非常简单的场景
N个用户,每个用户可以有0 ... N - 1个朋友(也是用户)
我如何在Java中为AppEngine数据存储建模
需要考虑的场景
用户x和用户y成为朋友(因此两者都需要在事务中更新自己的状态
sfussenegger.. 7
我们将用户关系建模为一个简单的UserRelation实体:
class UserRelation { User _from; User _to; RelationState _state; }
其中RelationState是一个枚举,描述状态(通常,不仅仅是友谊)
enum RelationState { BLOCKED, NONE, PENDING_FRIEND, FRIEND; }
实际上,我们也使用此枚举来进行授权,例如在用户配置文件上.
enum RelationState implements IRole { BLOCKED, NONE(BLOCKED), PENDING_FRIEND(NONE), FRIEND(PENDING_FRIEND); private final List_impliedRoles; private final List _roleStrings; private RelationState(final IRole... impliedRoles) { HashSet set = new HashSet (); for (final IRole impliedRole : impliedRoles) { set.add(impliedRole); set.addAll(impliedRole.getImpliedRoles()); } _impliedRoles = Collections.unmodifiableList(new ArrayList (set)); ArrayList list = new ArrayList (getImpliedRoles().size() + 1); list.add(getName()); for (final IRole implied : getImpliedRoles()) { list.add(implied.getName()); } _roleStrings = Collections.unmodifiableList(list); } public List getImpliedRoles() { return _impliedRoles; } public String getName() { return name(); } public boolean hasRole(final IRole role) { return this == role || _impliedRoles.contains(role); } public List getRoleStrings() { return _roleStrings; } } public interface IRole { public List extends IRole> getImpliedRoles(); public String getName(); public boolean hasRole(final IRole role); public List getRoleStrings(); }
最简单的是每个(对称)关系有两个对象(例如facebook上使用的友谊),而非对称关系只有一个对象(例如Twitter上使用的关注者或被阻止的用户).虽然这可能看起来像开销,但使用两个对象肯定简化了查询.
我认为AppEngine部分本身应该非常直接.
我们将用户关系建模为一个简单的UserRelation实体:
class UserRelation { User _from; User _to; RelationState _state; }
其中RelationState是一个枚举,描述状态(通常,不仅仅是友谊)
enum RelationState { BLOCKED, NONE, PENDING_FRIEND, FRIEND; }
实际上,我们也使用此枚举来进行授权,例如在用户配置文件上.
enum RelationState implements IRole { BLOCKED, NONE(BLOCKED), PENDING_FRIEND(NONE), FRIEND(PENDING_FRIEND); private final List_impliedRoles; private final List _roleStrings; private RelationState(final IRole... impliedRoles) { HashSet set = new HashSet (); for (final IRole impliedRole : impliedRoles) { set.add(impliedRole); set.addAll(impliedRole.getImpliedRoles()); } _impliedRoles = Collections.unmodifiableList(new ArrayList (set)); ArrayList list = new ArrayList (getImpliedRoles().size() + 1); list.add(getName()); for (final IRole implied : getImpliedRoles()) { list.add(implied.getName()); } _roleStrings = Collections.unmodifiableList(list); } public List getImpliedRoles() { return _impliedRoles; } public String getName() { return name(); } public boolean hasRole(final IRole role) { return this == role || _impliedRoles.contains(role); } public List getRoleStrings() { return _roleStrings; } } public interface IRole { public List extends IRole> getImpliedRoles(); public String getName(); public boolean hasRole(final IRole role); public List getRoleStrings(); }
最简单的是每个(对称)关系有两个对象(例如facebook上使用的友谊),而非对称关系只有一个对象(例如Twitter上使用的关注者或被阻止的用户).虽然这可能看起来像开销,但使用两个对象肯定简化了查询.
我认为AppEngine部分本身应该非常直接.