[英]Java - should I represent user ids with int, long or Integer?
当我需要对用户ID进行数值比较时,我应该做类似的事情:
int numeric_user_id = Integer.valueOf("1234343");
或者将它放入很长时间,还是保持整数?
谢谢!
唯一标识符不应带有任何特殊的语义含义; 永远 。 UUID或GUID类型仅为实体标识符设计,因此您不会向它们推断任何语义含义,这就是使它们不透明的原因。
许多实际好处之一是,在将数据导入和导出到不同数据库时,它们永远不会发生冲突, 即; 开发,qa,生产或在集群中使用时。 如果你使用普通的旧数字,特别是自动递增的数字,每个数据库将拥有相同数字的不同用户,并且几乎不可能阻止欺骗和其他不良数据蔓延到不同的系统。 UUID / GUID解决方案完全避免了这种问题。
有很多理由不将id用于除id之外的任何其他内容。 如果你有超过30000个beta用户会发生什么,当你想让一些人退出beta用户程序时会发生什么,当......时会发生什么?
至于将id用于识别beta用户的业务逻辑,请不要使用id,使用另一个属性标志来识别它们。 你可以有一个布尔标志,一个枚举或一些其他标志,甚至可以将他们是beta用户的事实与他们加入beta程序的时候结合起来,通过一个可以为nullable timestamp
来标记它们,但这可能会结束通过泄漏问题减少灵活性; 但在某些情况下可能是适当的。
public interface Identifiable {
public UUID getUUID();
}
public interface BetaUser extends Identifiable {
public boolean isBetaUser();
public Date joinedBetaProgramOn();
}
int
, long
和其他number
类型只应用于数学 ; 不适用于与数学问题无关的身份管理或业务逻辑。
如果要获取系统的nth
用户,请按连接日期对其进行排序,并从列表中获取其索引
我建议使用Long(一个对象,而不是一个原语),正是因为它允许一个空值。 在瞬态用户对象(复制,克隆等)上操作时,可能会出现这种情况。
但是,如果要将它们保存在数据库中,请将userId列设置为not null(更好的是,将其设为主键)。
使用Long而不是Integer,以便将来不必担心溢出。
不要比较userIds或尝试将它们用于任何逻辑目的(例如确定谁是测试版用户) - 将它们保留为不透明的标识符。 如果您需要知道谁是测试版用户,请引入数据(例如,accountType)来跟踪它。
正如其他人所提到的,UUID是另一种完全可以接受的方式,并且具有相当不透明的优点(尽管不完全),非常强制执行“不解释用户ID”规则。
我会说把它放到一个长原语中。 原因是,假设您从不希望它为null,您将永远不会遇到“getUserId()”方法返回空用户ID并且未捕获错误的意外情况。
如果将其存储为long与Long或Integer,则系统会立即将其检测为运行时错误。
如果将它存储在实际对象中,如Long,它可能为null。 如果这是一个错误,您的代码可能会在以后以不可预测的,可能是破坏性的方式失败。 最好尽早发现错误。
如果它可以为null并且您使用实际对象,请务必编写代码来处理null情况。
至于int vs long,你必须根据你是否认为它会超过int的大小来做出决定。
这也是假设您唯一的选择是普通的数字类型。 也许还有另一种更适合此类ID的数据结构,
在这种情况下,最好的方法是使用单独的基本类型而不是整数。
奇怪的是仍然没有回答主张int 。 作为自动递增的主键,足以满足99.99%的所有应用程序。 此外,用户引用很多(创建者,最后编辑器,......)所以有点节省而不是长期是好的。
如果您有用户备注和其他历史项目等内容,则Long将作为主键使用。
规则: 不久之后用int开头,作为对java源码和数据库的修改很容易。
int的最大值是2,147,483,647,超过20亿。 在大多数情况下,int应该绰绰有余。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.