FlockDB提供了一种非常好的社交图谱建模方法:系统中只有两个实体,User和Friendship。其中User表示图形的顶点,friendship表示两个用户之间的边。像这样:
User(id, first_name, last_name, birth_data, registration_timestamp)
友情(id, user1_id, user2_id, depth,其他友情参数…)
这种方法有很多优点
- 你可以指定参数的友谊,如朋友,亲密的朋友,在一段关系
- 你可以选择你的友谊是定向的还是非定向的
我的问题是如何实现这与谷歌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.Key()
(这是一个值,而不是属性类),使用db.ReferenceProperty(User)