在Data Store中保存额外的联系人数据

时间:2012-04-23 09:23:38

标签: google-app-engine social-networking google-cloud-datastore

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

此额外联系人数据必须由管理员管理,因此如果管理员添加“Whatsapp”,则所有用户必须出现“Whatsapp”字段可选,如果管理员删除了facebook数据,则所有用户的facebook信息必须被删除。

保存这些数据的最佳选择是什么,考虑到最有效的方式,例如,获取所有用户的Facebook,删除所有用户的Twitter ...由管理员?

由于

2 个答案:

答案 0 :(得分:2)

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

class Config(db.Model):
  """ singleton model """
  twitter  = db.BooleanProperty(default=False)
  facebook = db.BooleanProperty(default=False)
  whatsapp = db.BooleanProperty(default=False)

您的个人资料模型中的每个社交用户名单独的字段...

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作业来遍历所有配置文件并删除配置模型上已禁用的任何数据。

希望这有帮助

答案 1 :(得分:0)

您当然应该将包含用户特定数据的所有实体存储在用户的实体组中。这使您能够使用ancestor queries检索和操作这些实体,这些实体的性能优于非祖先查询。

要使详细实体成为用户实体组的一部分,您只需使用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)

此外,您可以使用无用的祖先查询来获取用户实体组中的所有实体:

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

这种方法的优点之一是它允许您的用户在任何一种服务上拥有多个帐户。

如果您需要为不同社交网站存储的数据变化太大而无法由单个简单模型提供,您可以使用Expando类来存储存储不同类型数据的实体。