Google app engine 在数据存储中保存额外的联系人数据

Google app engine 在数据存储中保存额外的联系人数据,google-app-engine,social-networking,google-cloud-datastore,Google App Engine,Social Networking,Google Cloud Datastore,我们正在使用GAE创建一个社交网络,当我们要创建用户的时,我们需要保存联系人关于facebook、twitter等的数据 这些额外的联系人数据必须由管理员管理,因此,如果管理员添加“Whatsapp”,则所有用户都必须显示一个可选字段“Whatsapp”,如果管理员删除facebook数据,则必须删除所有用户的facebook信息 考虑到最有效的方式,例如获取所有用户的facebook,删除所有用户的twitter,保存此数据的最佳选项是什么。。。由一个管理员 谢谢,有很多方法可以解决这个问题。

我们正在使用GAE创建一个社交网络,当我们要创建用户的时,我们需要保存联系人关于facebook、twitter等的数据

这些额外的联系人数据必须由管理员管理,因此,如果管理员添加“Whatsapp”,则所有用户都必须显示一个可选字段“Whatsapp”,如果管理员删除facebook数据,则必须删除所有用户的facebook信息

考虑到最有效的方式,例如获取所有用户的facebook,删除所有用户的twitter,保存此数据的最佳选项是什么。。。由一个管理员


谢谢,有很多方法可以解决这个问题。一种是有一个配置模型,比如(假设python)

并在您的个人资料模型中为每个社交用户名设置单独的字段

class Profile(db.Model):
  name = db.StringProperty()     # users name
  twitter = db.StringProperty()  # store twitter username here
  facebook = db.StringProperty() # store facebook username here
  whatsapp = db.StringProperty() # store whatsapp username here
将概要文件呈现给客户端时,请检查Config类以查看已启用哪些社交字段,并仅呈现这些字段

要处理删除,您可能需要编写一个cron作业来迭代所有概要文件,并删除配置模型上已禁用的任何数据


希望这有帮助

您当然应该将包含用户特定数据的所有实体存储在用户的实体组中。这使您能够使用检索和操作这些实体,它们比非祖先查询执行得更好

要使细节实体成为用户实体组的一部分,只需使用
parent
参数创建它们。例如:

class TwitterData(db.Model):
    twitter_name = db.StringProperty

def addTwitterData(user, twitter_name):
    # User is an instance of users.User
    new_twitter_entity = TwitterData(parent=user)
    new_twitter_entity.twitter_name = twitter_name
    new_twitter_entity.put()
现在,我可以像这样获取用户数据:

twitter_accounts = TwitterData.all().ancestor(user).fetch(1000)
此外,您还可以使用kindless祖先查询获取用户实体组中的所有实体:

all_networks = db.Query()
all_networks.ancestor(user).fetch(1000)
# Now, ancestor has all of user's Twitter, Facebook, Myspace accounts.
这种方法的优点之一是,它允许您的用户在任何一种服务上拥有多个帐户

如果您需要为不同的社交网站存储的数据差异太大,无法由一个简单的模型提供服务,那么您可以使用类来存储存储不同类型数据的实体

all_networks = db.Query()
all_networks.ancestor(user).fetch(1000)
# Now, ancestor has all of user's Twitter, Facebook, Myspace accounts.