Mysql 在django中将主键保留为自动递增字段有哪些优点和缺点?

Mysql 在django中将主键保留为自动递增字段有哪些优点和缺点?,mysql,django,primary-key,Mysql,Django,Primary Key,我对pk及其工作原理很好奇。Django自动将所有模型的主键设置为自动递增的整数字段,但这通常是效率方面的最佳选择吗 在什么情况下,将pk保留为递增整数比创建自定义pk更有害?人们通常使用的自定义pk是什么 编辑:最后一个问题。对于我以前的大多数项目,我都公开使用URL中的主键作为get参数,例如:website.com/1234/其中1234是查询模型的pk“id”。这被认为是一个糟糕的设计还是一个共同点 谢谢 A只是表中数据的一种特殊类型的索引。主键的一个限制是它必须是唯一的。使用where

我对pk及其工作原理很好奇。Django自动将所有模型的主键设置为自动递增的整数字段,但这通常是效率方面的最佳选择吗

在什么情况下,将pk保留为递增整数比创建自定义pk更有害?人们通常使用的自定义pk是什么

编辑:最后一个问题。对于我以前的大多数项目,我都公开使用URL中的主键作为get参数,例如:website.com/1234/其中1234是查询模型的pk“id”。这被认为是一个糟糕的设计还是一个共同点

谢谢

A只是表中数据的一种特殊类型的索引。主键的一个限制是它必须是唯一的。使用where子句中的主键执行查找时,检索该数据的速度非常快

如果查询永远不会使用主键执行查找或将其数据与基于主键的另一个表联接,那么使用自动递增主键没有多大用处。在这种情况下,这只是一个浪费的索引,最好使用表中其他列的主键(如果可以满足唯一约束的话)。如果有一个自动递增的pkey没有意义,并且您也不能有一个唯一的索引,那么只需创建没有pkey的表,并确保在获取、更新或删除单个记录时始终使用最有效的索引

我想不出任何理由,把pkey作为一个自动递增的整数会弊大于利,如果不使用它,只会浪费空间,变得无关。正如评论中指出的,当pkey是访问数据所需的唯一信息时,顺序主键可能会暴露信息或使您容易受到某些社会工程攻击

如果要使用作为主键,可以使用自定义主键。另一个实例可能是跟踪所有具有唯一序列号的项目的表。在这种情况下,您可以使用序列号作为pkey,而不是自动递增的ID,因为序列号也是唯一的,并且可能会在大多数查找或搜索中使用。

A只是表中数据的一种特殊类型的索引。主键的一个限制是它必须是唯一的。使用where子句中的主键执行查找时,检索该数据的速度非常快

如果查询永远不会使用主键执行查找或将其数据与基于主键的另一个表联接,那么使用自动递增主键没有多大用处。在这种情况下,这只是一个浪费的索引,最好使用表中其他列的主键(如果可以满足唯一约束的话)。如果有一个自动递增的pkey没有意义,并且您也不能有一个唯一的索引,那么只需创建没有pkey的表,并确保在获取、更新或删除单个记录时始终使用最有效的索引

我想不出任何理由,把pkey作为一个自动递增的整数会弊大于利,如果不使用它,只会浪费空间,变得无关。正如评论中指出的,当pkey是访问数据所需的唯一信息时,顺序主键可能会暴露信息或使您容易受到某些社会工程攻击


如果要使用作为主键,可以使用自定义主键。另一个实例可能是跟踪所有具有唯一序列号的项目的表。在这种情况下,您可以使用序列号作为pkey,而不是自动递增的ID,因为序列号也是唯一的,并且可能会在大多数查找或搜索中使用。

您关心的是效率吗?“自定义主键”是什么意思?对于您新添加的问题,这可能是您感兴趣的:未定义为默认型号的主键。AutoField感谢您的链接!它回答了第二个问题,使用UUID代替主键的自动递增序列也有优点。例如,支持脱机模式的Web应用程序应该使用UUID,因为它们在同步时不会冲突。您关心的是效率吗?“自定义主键”是什么意思?对于您新添加的问题,这可能是您感兴趣的:未定义为默认型号的主键。AutoField感谢您的链接!它回答了第二个问题,使用UUID代替主键的自动递增序列也有优点。例如,支持脱机模式的webapp应该使用UUID,因为它们在同步时不会冲突。