2012-02-08 22 views
1

我正在构建一个使用OAuth从外部API获取用户数据的App Engine应用程序。用户由外部API分配一个数字ID。我正在考虑给我的用户模型一个ID字段,它将存储外部用户ID的副本。然后我想起DataStore记录可以通过手动指定的数字ID给出键。如果我已经有一个唯一的ID,我应该使用它作为DataStore键吗?

external_id = int(api_response['user']['id']) 
handmade_key = db.Key.from_path('User', external_id) 

通过在创建记录前手动构建密钥,我就可以单独使用此ID来检索记录。

user = User.get_by_id(external_id) 

但是,我知道我需要分配API可能使用的整个范围的id。

allocate_ids(User, 10000) 

我的第一个问题是;我应该何时调用allocate_ids?似乎我应该只需要执行一次,但是如果每执行一次我的应用程序实例启动会影响性能?如果我从来没有把用户实体没有手动构造的密钥,我还需要allocate_ids吗?

第二个问题是,我疯了吗?这样做的常规方式是不是更麻烦

user = User.all().filter('external_id =', external_id) 

是否值得分配ID,以避免数据存储区查询的麻烦?

回答

2

如果您始终以您描述的方式构建密钥,则不需要allocate_ids。只有当您期望允许数据存储创建自己的自动递增数字ID时才有必要。

是的,您几乎总是用更少的字段和索引更好,所以使用外部唯一ID值创建Key,如您所描述的。

+0

另外 - 正如Dave W. Smith所说的那样,请查看比数字ID更灵活的“关键名称”。 – dkamins 2012-02-08 02:38:41

3

有什么办法可以阻止你将外部标识转换为字符串,并将其用作键名?

+0

不,但有没有好处? – arkanciscan 2012-02-08 03:36:18

+0

是的。它可以让您免去额外的簿记(以及代码和调试),您必须对'allocate_ids'执行操作,然后跟踪您将它们交给的方式。 – 2012-02-08 17:44:13

相关问题