为什么 Couchbase 服务器 API 需要新文档的名称

Why does the Couchbase Server API require a name for new documents

当您使用 Couchbase 服务器 API 创建文档时,参数之一是文档名称。这是做什么用的,为什么需要它?

使用 Couchbase Lite 时,您可以创建一个空文档,并为其分配一个 _id 和 _rev。您无需为其命名。那么这个参数在 Couchbase Server 中有什么用?

在 Couchbase Server 中,设计决定所有对象都由对象 ID、键或名称(所有相同的东西使用不同的名称)标识,并且不会自动分配。这样做的原因是密钥没有嵌入文档本身,密钥查找是获取该对象的最快方式,并且技术在服务器的引擎盖下规定了这一点。通过 ID 获取文档比查询它要快得多。查询意味着你在问一个问题,而通过 ID 获取对象意味着你已经知道答案并且只是告诉数据库为你获取它并且因此更快。

如果 ID 是随机的,那么您很可能必须查询数据库,这样效率较低。如果您愿意,Couchbase Mobile 的 sync_gateway 和 Couchbase Lite 可以代表您处理这个问题,因为它可以拥有自己的密钥空间和密钥模式,它可以管理密钥查找。但是,如果您自己使用 Couchbase SDK 直接访问数据库,那么知道该密钥将是获取该对象的最快方法。正如我所说,Couchbase Sync_Gateway 会为您处理此查找,因为它是应用程序服务器。当您直接使用 SDK 时,您可以获得更多控制权,并且会出现不同的设计模式。

Couchbase Server 中的许多人创建了一个对他们的应用程序有意义的键模式。作为用户配置文件存储的示例,我可能会考虑将配置文件分解为三个单独的文档,每个文档具有唯一的用户名(在本例中为 hernandez94):

1) login-data::hernandez94 是具有加密密码的对象,因为出于性能原因我需要一直查询它并希望它在 Couchbase 的托管缓存中。

2) sec-questions::hernandez94 是具有用户的 3 个安全问题的对象,因为我不经常使用它,所以不要关心它是否在托管缓存中

3) main::hernandez94 是用户的主要文档,其中包含我可能需要经常查询的所有其他内容,但不像其他时候那么频繁。

通过这种方式,我根据我的应用程序的访问模式定制了我的键空间命名,因此只获取我需要的数据,并且在我需要它以获得最佳性能的时候准确获取。如果我愿意,因为这些键名称在我的应用程序中是标准化的,所以我可以对所有这三个文档进行并行批量获取,因为我的应用程序可以构建名称并且速度非常快。再一次,我不是在查询数据,我有钥匙,去拿吧。我可以根据我的应用程序的访问模式进一步规范这个键空间命名。电子邮件地址::hernandez94、phones::hernandez94、appl-settings::hernandez94 等