Couchbase:使用文档ID有什么好处?

Couchbase:使用文档ID有什么好处?,couchbase,nosql,Couchbase,Nosql,我是NoSQL世界的新手,因为我已经编写RDBMS一段时间了。在RDBMS中,每个表都有主键的概念。您使用外键引用其他表,通常,如果非规范化很好,您会有另一个表,它基本上只包含表A和表B的映射,因此您可以连接它们 在Couchbase中,有一个文档ID的概念,其中一个文档有它自己的唯一键,该键位于文档本身的外部。这个文件ID的用途是什么?我看到它的唯一用途是查询对象本身(使用USEKEYS子句) 我可以在JSON文档中指定一个“id”和“type”,然后为文档键分配随机UUID 使用它有什么好处

我是NoSQL世界的新手,因为我已经编写RDBMS一段时间了。在RDBMS中,每个表都有主键的概念。您使用外键引用其他表,通常,如果非规范化很好,您会有另一个表,它基本上只包含表A和表B的映射,因此您可以连接它们

在Couchbase中,有一个文档ID的概念,其中一个文档有它自己的唯一键,该键位于文档本身的外部。这个文件ID的用途是什么?我看到它的唯一用途是查询对象本身(使用USEKEYS子句)

我可以在JSON文档中指定一个“id”和“type”,然后为文档键分配随机UUID

使用它有什么好处?如果可能的话

还有,为什么一些开发人员要在文档ID中添加“prexifes”(例如
客户::客户名称“

这是一个很好的问题,答案既有历史性的,也有技术性的

历史:Couchbase起源于CouchOne/CouchDB和Membase,后者是memcached键值存储的持久分布式版本。Couchbase仍然作为键值存储运行,检索文档的最快方法是通过键查找。您可以使用基于其中一个文档字段的索引来检索文档,b但是那样会慢一些

从技术上讲,能够根据文档ID极其快速地检索文档是Couchbase吸引许多用户/应用程序的一个优势(以及可扩展性和可靠性)

为什么有些开发人员要在文档ID中添加“前缀”,例如“客户::{customer name}”"。用于解决与快速检索和数据建模相关的问题。假设您有一个小文档,其中包含客户的基本配置文件,并且您使用客户的电子邮件地址作为文档ID。客户登录后,您的应用程序可以使用电子邮件作为ID,使用非常快速的k-v查找来检索此配置文件。是否保留此文档所有这些都是为了更快地检索到它

可能客户有时希望查看其整个购买历史记录。您的应用程序可能希望将该购买历史记录保存在单独的文档中,因为它太大,除非您确实需要它,否则无法检索。因此,您可以将其与文档id{email}一起存储::purchase_history,因此您可以再次使用k-v查找来检索它。此外,您不需要将purchase history记录的密钥存储在任何位置—这是隐含的。类似地,客户的邮寄地址可能存储在文档ID{email}::addresses.等下

Couchbase中的数据建模与传统RDBMS中的数据建模一样重要,但您的做法有所不同。免费在线培训中对此进行了很好的讨论:

为什么Couchbase仍然使用外部密钥而不是JSON中的主键字段?因为Couchbase仍然允许非JSON数据(例如二进制数据)。此外,虽然关系数据库可以允许多个字段或字段组合作为候选键,但Couchbase使用文档ID作为其切分版本,因此文档ID不能像其他字段一样处理