您可以为多个模型使用相同的字符串作为密钥ID吗?

时间:2011-06-06 10:51:42

标签: java google-app-engine

如果我有三个模型类 - TaxpayerCriminalPatient - 我可以使用socialSecurityNumber作为所有三个的密钥ID,还是我需要制作它甚至跨模型类也是独一无二的。

换句话说,应该是这样的:

String socialSecurityNumber = "123-45-6789";
Long now = new Long(System.currentTimeMillis()); // use time to create uniqueness
String name = now.toString() + "-" + socialSecurityNumber;
Key key = KeyFactory.createKey(getClass().getSimpleName(), name);

或者这个:

String socialSecurityNumber = "123-45-6789";
Key key = KeyFactory.createKey(getClass().getSimpleName(), socialSecurityNumber);

2 个答案:

答案 0 :(得分:1)

是。密钥名称只是密钥的一部分,以及应用程序ID,实体类型和任何祖先密钥,因此可以在不同的模型中使用相同的密钥名称。

但是,请注意,社会安全号码是一个糟糕的主键,原因如下:

  • 您可能不应该首先从您的用户那里收集它,他们可能有权拒绝将其提供给您。
  • 并非所有人都拥有SSN - 特别是那些不是美国公民的人,甚至还有一些美国公民。
  • 它们不是唯一的:旧的SSN号码可以回收利用。在SSN系统的早期阶段,也发布了一些重复的内容。

答案 1 :(得分:0)

如果它是单独的表,并且您确定它确实是主键(已知犯罪分子使用别名),我认为没有真正的问题。

请注意,我仍然会使用代理键作为Id,但这是因为我已经在这个区域变得教条,因为我看到很多“有意义的主键”突然改变或者情况发生变化所以主键是否定的更长的主键。

在普通字段中具有密钥的情况下(例如,具有唯一的索引约束),有更多选项可以处理发生的事情。