我有我的用户表(伪sql,因为我使用ORM,我必须支持几种不同的数据库类型):
id: INTEGER, PK, AUTOINCREMENT
UUID : BINARY(16) (inserted by an update, it's a hash(id) )
我目前在所有其他表中使用FK的id。 但是,在我的REST API中,我必须使用UUID提供信息,这会导致以后查询问题。
我应该:
答案 0 :(得分:2)
通常,最好将自动递增的id用于外键引用,而不是使用其他一些唯一列的组合。
一个重要原因是单个整数上的索引比其他列类型上的索引更有效 - 如果没有其他原因而不是索引更小,那么它占用更少的磁盘和更少的内存。此外,在辅助表中存储较长的UUID还有额外的开销。
这不是唯一的考虑因素。另一个考虑因素是,您可以根据需要更改UUID,而无需更改外键引用。例如,你可能有一天醒来并说'#34; id必须以AAA"开头。您可以更改表并更新表并完成它 - 或者您也可以担心外键引用。或者,您可以添加组织列,并确定唯一键是UUID和组织的组合。如果将UUID用作外键引用,则这些操作会更加困难/更慢。
当你有复合主键(多个列)时,使用自动增加的id是一个更好的主意。在这种情况下,使用连接的id可以防止其中一个连接条件被遗漏的错误。
正如您所指出的那样,查找给定id的UUID应该是具有正确索引的快速操作。可能存在一些您不希望拥有ID的临界情况,但总的来说,这是一个好主意。