Database design 使用数据库表';s ID作为外部API标识符?

Database design 使用数据库表';s ID作为外部API标识符?,database-design,primary-key,uniqueidentifier,api-design,Database Design,Primary Key,Uniqueidentifier,Api Design,我们正在设计一个带有外部API的HTTP服务,该服务将需要存储一些项目,外部API使用者稍后可能需要检索这些项目。所有内容都存储在表foos中,当前的计划是只使用表的主ID键作为外部唯一标识符。我的直觉告诉我这是一个糟糕的设计,但我无法有效地论证我的观点,部分原因是我无法清楚地说出原因 以下是迄今为止我能想到的唯一的缺点: 如果我们想改变模式呢?我们必须重新填充所有内容,确保它们的ID保持完整,或者在移动过程中实现另一个唯一标识符列 轻微(?)安全风险(我知道,通过默默无闻实现的安全不安全等)

我们正在设计一个带有外部API的HTTP服务,该服务将需要存储一些项目,外部API使用者稍后可能需要检索这些项目。所有内容都存储在表
foos
中,当前的计划是只使用表的主ID键作为外部唯一标识符。我的直觉告诉我这是一个糟糕的设计,但我无法有效地论证我的观点,部分原因是我无法清楚地说出原因

以下是迄今为止我能想到的唯一的缺点:

  • 如果我们想改变模式呢?我们必须重新填充所有内容,确保它们的ID保持完整,或者在移动过程中实现另一个唯一标识符列
  • 轻微(?)安全风险(我知道,通过默默无闻实现的安全不安全等)

还有其他主要的缺点吗,还是我只是有点偏执?也将感谢一些链接到已发表的文章谈论这一点

我要说的是,如果你的数据库被锁定,这并不重要,除非:

  • 共享API密钥意味着C.I.a.用户信息的丢失
  • 您可以让用户轻松地调用API,而无需二级身份验证
我相信您已经意识到,采取措施阻止SQL注入会阻止任何人利用这些信息,但是知道索引范围可能意味着有人会知道索引范围中的少一个或多一个是用于访问API的有形密钥


例如: 如果您可以在不登录的情况下通过URL访问API,那么使用索引范围是不好的。

如果我知道我的钥匙是145,那么144146可能也可以打电话

使用GUID方案是解决此问题的一种方法,但有了它,您就有了其他方法:
ID(索引):145
ID(GUID):C87FC84A-EE47-47EE-842C-29E969AC5131


最后,您可以添加另一列,将随机哈希保存为唯一的API键,如您所说:

ID(散列):da39a3ee5e6b4b0d3255bfef95601890afd80709

非常安全。ID将与其余数据一起备份和恢复,因此没有问题。也没有我能想到的任何安全问题。设计是否糟糕取决于品味


IIRC易趣和PayPal API是这样工作的,但我不能引用这方面的参考。

我同意你的观点,因为你的第一点:

如果您最终出于任何原因更改了模式,那么您的服务应该抽象物理更改。维护旧钥匙让这变得非常困难