繁体   English   中英

Java - 我应该使用int,long还是Integer表示用户ID?

[英]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();
}

intlong和其他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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM