java建模_如何在Java中建模社交图

本文探讨了如何使用UserRelation实体来建模用户之间的关系,包括BLOCKED, NONE, PENDING_FRIEND和FRIEND四种状态。同时,通过实现IRole接口, RelationState枚举不仅用于描述关系状态,还用于授权控制。这种方法简化了查询,特别是对于对称和非对称关系的处理。尽管可能增加了一些存储开销,但它提高了查询效率并简化了系统设计。
摘要由CSDN通过智能技术生成

我们将用户关系建模为一个简单的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上使用的友谊)和仅对于非对称关系的单个对象(例如在推特上使用的关注者或被阻止的用户),最容易具有两个对象.虽然这可能看起来像开销,但使用两个对象肯定简化了查询.

我认为AppEngine部分本身应该非常直接.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值