0

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

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

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

谢谢

4

2 回答 2

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

希望这可以帮助

于 2012-04-23T13:21:25.037 回答
0

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

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

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

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

于 2012-04-23T13:40:21.980 回答