在 Web 服务中处理 id 的最佳实践是啥?

Posted

技术标签:

【中文标题】在 Web 服务中处理 id 的最佳实践是啥?【英文标题】:What are best practices for handling ids in web services?在 Web 服务中处理 id 的最佳实践是什么? 【发布时间】:2012-04-18 12:47:22 【问题描述】:

我们有两个独立的系统通过网络服务进行通信。称它们为前端和后端。许多处理涉及更新后端的列表。例如,前端需要更新特定的人。目前,我们正在设计后端,我们正在决定界面应该是什么。我们将需要实际的数据库 ID 来更新底层数据库,但我们也看到将数据库 ID 传播给我们的消费者可能是个坏主意。

强制客户端(即前端)必须将 id 发送回 Web 服务以更新特定实体有哪些替代方法?我们试图避免使用 id 的另一个原因是前端通常会保存这些更改以供以后发送。这将需要前端将我们的 id 保存在他们的系统中,这似乎也是一个坏主意。

我们考虑了以下几点:

1) 将数据库 ID 发送回前端;他们必须将这些发回以处理更改

2) 将散列 ID(基于数据库 ID)发送回前端;他们必须将这些发回以处理更改。

3) 根本不强制客户端发送 id,而是让他们发送原始实体和新实体并“匹配”到我们在数据库中的实体。他们的原始实体必须与我们保存的实体相匹配。我们还必须定义什么构成了我们的实体和他们的新实体之间的匹配。

【问题讨论】:

yipes - 感觉 1 和 2 基本相同。还有 3 - 当你“定义”什么是匹配时 - 这几乎肯定是关键的 id ..(或者更丑 - 找到所有东西的备用键) 【参考方案1】:

前端唯一合理的方法是以某种方式识别数据库中的人。

匹配完整实体是不可靠且不明显的;要将散列 ID 返回到前端,您需要先从前端接收未散列的 ID,或者在 ID 下执行一些可恢复的“散列”(更像是“加密”),所以无论如何都会有一些人标识符。

恕我直言,它是数据库 ID 还是可以从中提取 ID 的某些数据(加密的数据库 ID)都没有关系。为什么您认为知道数据库 ID 的消费者是个坏主意?只要每个人都属于一个消费者,我认为没有任何问题。

如果人(数据库中的对象)和消费者之间存在多对多关系,那么您可以“加密”(广义上)对象 ID,以便加密依赖于消费者。例如,在与消费者通信时,您可以使用 DB 中的链接(对象和消费者之间)条目的 ID。

如果向消费者发送 ID 对您来说似乎不是一个好主意,因为消费者可能会逐个枚举所有 ID,您可以通过使用 GUID 而不是整数自动递增 ID 来避免此问题。

PS:至于您的评论,请考虑使用例如GUID 作为对象 ID。 ID是数据的一部分,不是schema的一部分,所以在数据库之间迁移时会保留。这样的 ID 也不会包含敏感信息,因此向消费者(或其他人)透露 ID 是完全安全的。如果您想防止创建具有相同 SSN 的两个不同的人,只需在您的 SSN 字段上添加一个UNIQUE 键,但不要使用 SSN 作为 ID 的一部分,因为这种方法有很多严重的缺点,无法透露ID 是其中最小的。

【讨论】:

我们一直犹豫发送数据库 ID 的主要原因是它在某种程度上将两个系统耦合在一起。如果我们决定更改数据库,这可能会影响前端。此外,可以想象,如果 id 是自然键(例如基于 ssn),它们可能包含一些敏感信息。我们正在努力务实,但也遵循最佳实践。感谢您的意见。 1) 更改数据库不应更改 ID。 2)ID不应该是自然键;如果由于某种原因,SSN 会发生变化(例如,客户错误地输入了错误的 SSN),或者您需要支持来自其他国家/地区的客户,该怎么办?你从错误的角度看待问题;首先你实现了错误的数据结构(ID 包含敏感信息并且会随着 DB 返工而发生变化),然后你试图在不知道对象 ID 的情况下实现某种方式来处理对象。【参考方案2】:

在我看来,记录的 ID 不会向任何人传达任何敏感信息。 因此,将数据库 ID 传输到前端(和一般情况下)没有问题。 唯一的担忧与数据库一致性问题有关,但我看不到任何问题。 此外,从性能来看,它要好得多,因为您不需要查询数据库的属性来查找数据库 ID。

此外,如果您发送 id 的散列,则无法从散列中提取 id。 您必须在数据库中找到一个与哈希匹配的 id,这不是很好的 IMO

所以:

我们还看到将数据库 ID 传播给我们的消费者可能是一个 馊主意。

我没看到。如果你能解释为什么你认为这是一个坏主意,可能会有讨论。

【讨论】:

查看我的 cmets 下面的其他答案。如果数据库 id 使用自然键,我的主要论点是系统的耦合和可能的安全问题。 1)如果数据库是SSN,这可能是个问题。但是是这样吗?还是我们在理论上说?2)关于耦合:如果您更改数据库,数据将不会被丢弃。您的架构将迁移到新数据库。那么您担心什么? 1) 我们在理论上讨论。 2)是的,架构可能会改变,但架构和数据库独立发展会很好。即使从非理论的角度来看,这也很常见,它们的建模方式不同。数据库的标准化与实际模式不同。感谢 cmets。 我理解你的顾虑。我在实践中看到了数据库 id 的使用,实际上它解决了很多问题(从实现方面)。如果可以的话,我建议你看看您有什么要求并应用这些要求。一般而言,针对不适用于您的案例的问题调查最佳实践/方法是恕我直言的常见错误路径。它会导致构建框架而不是简单的类。它会增加开发时间、调试时间和维护时间回想起来,他们通常是没有理由的。

以上是关于在 Web 服务中处理 id 的最佳实践是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 redux 中处理异步操作错误的最佳实践是啥?

在固定的 UILabel 中处理长文本的最佳实践是啥

在 git 存储库中处理密码的最佳实践是啥?

在 R 中处理时间序列的最佳实践是啥?

使用 Django(或任何 Web 框架)的 AJAX 的“最佳实践”是啥

处理 javascript 和 css 文件的最佳实践是啥