如何在Google App Engine中创建唯一的键名
我在为我的在线选举应用程序创建独特的投票者标识时遇到了一些麻烦。这里有一些相关的实体:
- 1 次选举
- 5 位候选人
- 100,000 名选民
- 最多 100,000 票
我需要为每个选民创建一个独特的标识,原因可以在这里找到。一个电子邮件地址在特定选举中对选民来说是唯一的,但在多个选举中不一定是唯一的(因为同一个选民可能参加多个选举)。
如果选举是选民实体的父实体,那么将选民的电子邮件与选举的父实体结合使用就足够了,可以生成一个独特的标识。不过,由于我需要在更新选民实体时使用事务(以确保选民不能重复投票),我觉得不想使用实体组,因为根据文档,一次只能更新一个选民。
另一种解决方案是为每个选民创建一个独特的标识,格式如下:
E<election ID>_<voter email>
例如,
E1001_john@example.com
这样为每个选民创建独特标识的方法合理吗?
2 个回答
0
这个应该是唯一的。我个人可能会使用一个GUID(全局唯一标识符),并把它和一个数据存储联系起来,确保每个投票会话和投票者都是独一无二的,不过这只是我个人的选择。
3
再仔细检查一下你的假设。现在有一种情况可能会影响ID的唯一性:
如果两个投票者使用了相同的电子邮件地址怎么办?我知道我父母之间只有一个电子邮件地址。如果这样的话,你的ID就会重复。
有很多方法可以减少这种重复的情况。如果情况真的很糟糕,你可以对一些投票者的信息进行哈希处理。其实,你甚至可以对创建ID的确切时间进行哈希处理。
(嗯……我想我还挺喜欢哈希的……)
最简单的解决方案是什么呢?就像数据库中为ID做的那样:用一个数字。每次你添加一个新投票者,就把这个数字加一。第一个投票者的ID是1,第二个是2,依此类推。如果需要的话,你可以把这个ID转换成字符串。
但是,不要假设数据是唯一的。两个人可能有相同的名字、街道地址、电子邮件地址或电话号码等等。
希望这些能给你一些启发!