Mysql 事先知道主键的值

Mysql 事先知道主键的值,mysql,sql,database,postgresql,Mysql,Sql,Database,Postgresql,如果您总是知道,在这种情况下,从某个API返回的值字符串是唯一的,那么可以将该值用作唯一定义记录的主键吗 真的有必要添加一个额外的id列,它只是一个自动递增的值吗?自然主键作为主键是完全可行和合理的。然而,有一些事情需要考虑: 主键的主要用途之一是外键关系。整型主键非常小,长度都相同。字符串不适合索引,因为它们的长度通常不同,并且通常比整数长。 您确定主键的定义不会随时间而更改吗? 从隐私/安全的角度来看,在一组表中显示外部密钥是否安全?这些表中包含外键引用。 我会说,合成外键,即作为数字创建的

如果您总是知道,在这种情况下,从某个API返回的值字符串是唯一的,那么可以将该值用作唯一定义记录的主键吗


真的有必要添加一个额外的id列,它只是一个自动递增的值吗?

自然主键作为主键是完全可行和合理的。然而,有一些事情需要考虑:

主键的主要用途之一是外键关系。整型主键非常小,长度都相同。字符串不适合索引,因为它们的长度通常不同,并且通常比整数长。 您确定主键的定义不会随时间而更改吗? 从隐私/安全的角度来看,在一组表中显示外部密钥是否安全?这些表中包含外键引用。
我会说,合成外键,即作为数字创建的人工外键,可能有缺点。如果对创建的每个数据库执行此操作,则整个数据库中都有不兼容的密钥。因此,像产品id这样的东西最终取决于定义它的系统-这可能会导致不必要的混淆。

自然主键作为主键是完全可行和合理的。然而,有一些事情需要考虑:

主键的主要用途之一是外键关系。整型主键非常小,长度都相同。字符串不适合索引,因为它们的长度通常不同,并且通常比整数长。 您确定主键的定义不会随时间而更改吗? 从隐私/安全的角度来看,在一组表中显示外部密钥是否安全?这些表中包含外键引用。
我会说,合成外键,即作为数字创建的人工外键,可能有缺点。如果对创建的每个数据库执行此操作,则整个数据库中都有不兼容的密钥。因此,产品id之类的东西最终取决于定义它的系统-这可能会导致不必要的混乱。

除了性能问题,PK必须服务于业务逻辑。PK并不总是必须是一个自动序列号。自动序列号对于快速用户交互(如查询和更新请求)以及ETL情况仍然很有用。考虑API会发生什么变化,并且不会总是返回一个唯一的值。另外,查看您的数据行,并确定哪些列可以使记录在业务意义上具有唯一性。您可能会获得一个或多个候选主键。考虑使用最短的那些代替API密钥,而不是自动序列。简而言之,我建议您不要依赖无法控制的数据,除非有某个来源的合同规定数据总是唯一的。

除了性能问题之外,PK必须服务于业务逻辑。PK并不总是必须是一个自动序列号。自动序列号对于快速用户交互(如查询和更新请求)以及ETL情况仍然很有用。考虑API会发生什么变化,并且不会总是返回一个唯一的值。另外,查看您的数据行,并确定哪些列可以使记录在业务意义上具有唯一性。您可能会获得一个或多个候选主键。考虑使用最短的那些代替API密钥,而不是自动序列。简言之,我建议您不要依赖无法控制的数据,除非有某个来源的合同规定数据总是唯一的。

假设我使用的密钥来自API,例如:API可能会发回订单和约会。现在,在这种情况下,约会和订单具有1对1的关系。使用API的ID作为主键/外键约束更好吗,还是使用自己生成的ID更好?我完全同意。如果一个数据库中有很多记录,那么它肯定会产生不同的变化。表和索引的大小是应该考虑的因素。一种常用的模式是:使用泛型PK并将自然PK作为唯一列添加到表中,这样您就可以获得泛型键的优点,而对性能和大小的影响很小。@stuy:基本上,使用您获得的键是可以的,但另一方面,您对API没有控制权,如果有一个bug,你会得到两次id,你什么都做不了。。如果你有一个通用id,你仍然能够处理它,比如说,如果我使用的那些密钥来自API,例如:API可能会发回订单和约会。现在,在这种情况下,约会和订单具有1对1的关系。使用API的ID作为主键/外键约束更好吗,还是使用自己生成的ID更好?我完全同意。如果存在ar,则DB的增长肯定会有所不同
e数据库中有许多记录。表和索引的大小是应该考虑的因素。一种常用的模式是:使用泛型PK并将自然PK作为唯一列添加到表中,这样您就可以获得泛型键的优点,而对性能和大小的影响很小。@stuy:基本上,使用您获得的键是可以的,但另一方面,您对API没有控制权,如果有一个bug,你会得到两次id,你什么都做不了。。如果你有一个通用id,你仍然能够处理它