sql - 数据库ID最佳做法

标签 sql language-agnostic identity auto-increment surrogate-key

我想知道构建和存储ID的最佳做法是什么。几年前,一位教授以社会保险号为例,向我讲述了身份证明系统构造不佳的危险。特别是,由于SSN没有错误检测功能,因此无法分辨9位数字的字符串和有效的SSN之间的区别。现在,政府机构需要“姓氏+ SSN”或“生日+ SSN”之类的信息来跟踪您的数据并确保对其进行验证。另外,根据您的出生地,您的社会保险号是可以预测的。

现在,我正在建立一个用户数据库...,基于此建议,“userid mediumint auto_increment”将是 Not Acceptable 。特别是如果我打算将此ID用作用户的主要标识。 (例如,如果我允许用​​户更改其用户名,则与数字用户名相比,要跟踪用户名会更加困难……需要级联外键等。)电子邮件更改,用户名可以更改,密码也要更改。 。,但用户名应永远保持不变。

显然,auto_increment仅设计用于surrogate_keys。也就是说,仅当您已经具有主要标识机制时,它才是有用的快捷方式,但不应将其用作数据的“固有标识符”。创建随机UUID看起来很有趣,但是随机性使我无法接受。

所以我问:创建“主键”标识号的最佳实践是什么?

最佳答案

您正在将内部数据库功能与外部搜索条件混淆。

自动增量代理键对于内部应用程序使用很有用。切勿将其传递给用户。识别业务对象(无论是用户还是发票)都是使用有关对象的唯一信息来完成的,例如SSN,CCN或DOB。使用尽可能多的信息来唯一标识对象。

我强烈建议您如果必须为每个客户提供一些新发明的ID值,则不要在该字段上链接所有客户数据表。

关于sql - 数据库ID最佳做法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4350369/

相关文章:

sql - 使用子字符串转换将数据类型 varchar 转换为数字时出错

language-agnostic - HEX RGB 颜色处理方法?

clojure - 这不是 monad,对吧?

c# - 是否可以使用 SQL 查询 XML 文件?

mysql - 当算术运算符存储在SQL数据库中时,如何在SQL查询中执行算术运算

mysql - 在 D : drive instead of C: 中安装 MySql

c - 用 C89 注释替换 C++ 单行注释

c - 查找具有相同数量的 1 和 0 的最大子序列二进制集

java - Hibernate 5,Oracle12c 标识列 - 找不到序列

c# - 在 Blazor 中结合使用 ASP.Net Core Identity 和 Azure 身份验证