我有一个用户数据库,所有用户都有一个唯一的 ID (Java UUID) 来区分他们,因为其他数据(名字、IP 和姓氏)可能包含重复项。将 _id 设置为唯一 id 是个好主意吗,因为这可以让我免于创建和索引另一个字段并拥有无用的 _id 字段。
最佳答案
这是一个有争议的话题,具体情况因数据库引擎而异。我将更普遍地假设数据库引擎可能会在稍后的时间点发生变化。为了帮助您做出决定,以下是使用 UUID 作为行 ID 的一些优点和缺点:
优点:
- 在数据不同但性质相似的表中具有唯一性
- 使得从一个数据库引擎转移到另一个数据库引擎变得非常简单,因为行的 ID 并不完全依赖于插入时间
缺点:
- 不允许优雅的聚集索引,因为 UUID 不是连续的。这意味着当您执行插入时,您的数据库将必须重新排列大量内存页面以保留顺序(某些数据库引擎(例如 SQL Server)创建一个“唯一符”字段来解决此问题,但最终,成本与使用 int 作为主键)
- 使应用程序或日志文件中的调试变得更加困难,因为 int 字段比 UUID 更容易比较/查看
- 针对表的联接比 int 慢,这对于大多数数据库实现来说都是如此
我个人的建议是使用 int 作为你的 ID。您对表的联接将会更快,并且总体上更容易调试。当然,您仍然可以将 UUID 作为外键,但随着解决方案的扩展,易于查看的小值将会派上用场。
关于java - 使用自定义 _id 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27664914/