Google App Engine中用户实体的相应键

时间:2012-08-27 12:28:40

标签: database google-app-engine key

我的Google App Engine模型中有一个用户实体,用户有一个名字,电子邮件,密码和其他一些东西。目前,我使用用户的电子邮件作为实体的密钥。到目前为止,我还没有考虑过如果用户要更改他的电子邮件会发生什么。

使用电子邮件作为密钥非常方便的原因是客户端设备始终知道用户的电子邮件,而不是存储和跟踪某些单独的user_id,通过电子邮件查找会更方便。

那么如果用户确实更改了他们的电子邮件呢?毕竟这是一件大事 - 要做的工作是微不足道的吗?为用户提供哪些更好的密钥选项?

4 个答案:

答案 0 :(得分:2)

在App Engine上使用联合身份选项我已经采用了将primary_federated_identity作为每个用户的密钥的方法。这样,用户可以更改电子邮件,处理任何其他内容,但仍然是同一个人。

与@Tim Hoffman一样,以及primary_federated_identity,我使用了一个子实体,但就我而言,它是一个UserIdentity集合。

class User(db.Model):
    primary_federated_identity = db.StringProperty(required = True)
    handle = db.StringProperty(required = True)
    created = db.DateTimeProperty(required = True, auto_now_add = True)
    ...

class UserIdentity(db.Model):
    user = db.ReferenceProperty(User, collection_name = 'user_identities')
    user_federated_identity = db.StringProperty(required = True)
    user_federated_provider = db.StringProperty(required = True)
    ...

当我写一个新用户时:

from google.appengine.api import users
from models.models import User
...
def some_function():
    key_name = users.federated_identity()
    my_site_user = User(key_name = key_name, primary_federated_identity=key_name, handle=handle)

当我找回一个时:

key_name = user.federated_identity()
return User.get_by_key_name(key_name)

答案 1 :(得分:1)

使用int / Integer,GAE将为您分配一个键值。

答案 2 :(得分:0)

如果是电子邮件==密钥,那么当用户想要更改其电子邮件时,您需要创建一个新的用户实体 通常电子邮件不是一个好的关键因素,你可以有一个系统将所有旧的引用替换为新的引用,但这取决于你的系统有多复杂。

答案 3 :(得分:0)

在我设计的项目中,我们有登录&散列密码加上其他属性(启用标志,密码更改标志等)保留为用户的单独子实体。这个实体的关键是登录。这意味着密钥(登录)可以随时更改,我们可以删除/替换子实体而不必重新生成等等.....它确实意味着需要祖先查询才能获得用户,但是然后在第一次检索后缓存(memcache等)。

此方法将所有登录详细信息保留在用户之外(我们实际上支持google登录以及authtkt userid / passwd样式登录,方法是更改​​子身份验证实体的实现。)