Web applications 如何在GoogleAppEngine中建立类似flockDB的社交图模型

Web applications 如何在GoogleAppEngine中建立类似flockDB的社交图模型,web-applications,google-app-engine,Web Applications,Google App Engine,FlockDB提供了一种非常好的建模社交图的方法:系统中只有两个实体:用户和友谊。其中,用户表示图的顶点,友谊表示两个用户之间的边。像这样: 用户(id、名、姓、出生数据、注册时间戳) 友谊(id、user1\u id、user2\u id、深度、其他友谊参数…) 这种方法有许多优点 您可以为友谊指定参数,如关系中的朋友、亲密朋友 你可以选择你的友谊是否有方向性 我的问题是如何用Google AppEngine提供的数据存储实现这一点。这是我的第一次尝试,但我不明白如何真正地为友谊实体分配密

FlockDB提供了一种非常好的建模社交图的方法:系统中只有两个实体:用户和友谊。其中,用户表示图的顶点,友谊表示两个用户之间的边。像这样:

用户(id、名、姓、出生数据、注册时间戳)

友谊(id、user1\u id、user2\u id、深度、其他友谊参数…)

这种方法有许多优点

  • 您可以为友谊指定参数,如关系中的朋友、亲密朋友
  • 你可以选择你的友谊是否有方向性
我的问题是如何用Google AppEngine提供的数据存储实现这一点。这是我的第一次尝试,但我不明白如何真正地为友谊实体分配密钥

class User(db.Model):
  name = db.StringProperty()
  age = db.IntegerProperty()
  registeration_ts = db.DateTimeProperty(auto_now_add=True)

class FriendShip(db.Model):
  user1 = db.Key()   // key to some user in user1
  user2 = db.Key()   // key to some user in user2
  creation_ts = db.DateTimeProperty(auto_now_add=True)
  updated_ts = db.DateTimeProperty(auto_now_add=True)

一种方法是这样建模:

class User(db.Model):
 name = db.StringProperty()
 friends = db.SelfReferenceProperty(collection_name="subscribers")
这将是一个代表用户和朋友的简单模型。但我认为它有两个缺点:

  • 因为友谊不是一个实体,我们不能赋予它属性
  • 由于现在维护了一个集合,我不知道像获取朋友的朋友这样的查询速度有多快
  • 使用
    db.ReferenceProperty(User)
    代替
    db.Key()
    (这是一个值,而不是属性类)