很简单的场景如何在Java的社交图谱模型
N个用户,每个用户都可以拥有0 .. N - 1周的朋友(谁也有网友)
我怎样才能在模拟这个Java应用服务引擎数据存储
方案考虑
- 用户X和用户Y成为朋友(所以都需要更新自己的状态,在交易
很简单的场景如何在Java的社交图谱模型
N个用户,每个用户都可以拥有0 .. N - 1周的朋友(谁也有网友)
我怎样才能在模拟这个Java应用服务引擎数据存储
方案考虑
我们模拟用户关系的简单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<IRole> _impliedRoles;
private final List<String> _roleStrings;
private RelationState(final IRole... impliedRoles) {
HashSet<IRole> set = new HashSet<IRole>();
for (final IRole impliedRole : impliedRoles) {
set.add(impliedRole);
set.addAll(impliedRole.getImpliedRoles());
}
_impliedRoles = Collections.unmodifiableList(new ArrayList<IRole>(set));
ArrayList<String> list = new ArrayList<String>(getImpliedRoles().size() + 1);
list.add(getName());
for (final IRole implied : getImpliedRoles()) {
list.add(implied.getName());
}
_roleStrings = Collections.unmodifiableList(list);
}
public List<IRole> getImpliedRoles() {
return _impliedRoles;
}
public String getName() {
return name();
}
public boolean hasRole(final IRole role) {
return this == role || _impliedRoles.contains(role);
}
public List<String> getRoleStrings() {
return _roleStrings;
}
}
public interface IRole {
public List<? extends IRole> getImpliedRoles();
public String getName();
public boolean hasRole(final IRole role);
public List<String> getRoleStrings();
}
这是最简单的具有用于每个(对称)关系的两个对象(例如,如在Facebook上使用的友谊),只有一个单一的对象的非对称的关系(例如,作为在twitter使用或阻止的用户的追随者)。虽然这可能看起来像开销一样,但使用两个对象确实简化了查询。
我认为AppEngine零件本身应该非常简单。
考虑使用Friendship
表,只有两个外键user1
和user2
。此表中的条目模拟两个用户之间的社交连接。您甚至可以添加更多列来描述此社交关系的type
。
(或考虑sfussenegger的答案;)相同的想法,但更好的演示文稿)
感谢你们两位 - 非常有帮助的答案。 – 2010-01-26 09:31:44
这是一个伟大的想法,并给了我更大的灵活性。 我最初的想法是与以下内容对齐的东西 class User用户{0} {0} {0} 设置朋友; } 对此,我很难弄清楚关系(自我指涉)以及如何表示它们,并担心交易成本。 在做更新时,我仍然需要考虑使用事务,但它更清晰明了。 –
2010-01-26 09:30:18