2010-01-26 33 views
4

很简单的场景如何在Java的社交图谱模型

N个用户,每个用户都可以拥有0 .. N - 1周的朋友(谁也有网友)

我怎样才能在模拟这个Java应用服务引擎数据存储

方案考虑

  • 用户X和用户Y成为朋友(所以都需要更新自己的状态,在交易

回答

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<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零件本身应该非常简单。

+0

这是一个伟大的想法,并给了我更大的灵活性。 我最初的想法是与以下内容对齐的东西 class User用户{0} {0} {0} 设置朋友; } 对此,我很难弄清楚关系(自我指涉)以及如何表示它们,并担心交易成本。 在做更新时,我仍然需要考虑使用事务,但它更清晰明了。 – 2010-01-26 09:30:18

0

考虑使用Friendship表,只有两个外键user1user2。此表中的条目模拟两个用户之间的社交连接。您甚至可以添加更多列来描述此社交关系的type

(或考虑sfussenegger的答案;)相同的想法,但更好的演示文稿)

+0

感谢你们两位 - 非常有帮助的答案。 – 2010-01-26 09:31:44