决定在 cloudant 中创建多个数据库和关系

Decide create multiple database and relational in cloudant

我目前正在学习 NOSQL cloudant 并尝试设计数据库,因为我正在学习 cloudant 将所有记录视为文档并使用非规范化 table。所以我目前对如何决定哪些需要在一个文档中,哪些需要分开感到困惑。

以下是我的测试用例: 假设我正在设计商店书 table 的结构,为了简单起见,我将拥有这个 table 的书,商店,STORE_BRANCH

BOOK 字段:_id,book_name,作者 存储字段:_id,store_name STORE_BRANCH 字段:_id,store_branch_name,地址,store_id_fk

对于上述情况,我无法决定应该将 "price" 字段放在哪里?至于普通的 RDBMS,我将只创建另一个 table 并具有字段:(商店 book_id、store_branch_id 和价格),这是假设每个分支的书的价格不同。所以我想知道如何将其放入 cloudant 中?

欢迎任何建议

您的疑虑对于 RDMBS 用户来说很常见。 在 NoSQL 中,您通常使用将所有内容都放在一个文档中的方法。事实上,在某些情况下,在像 Cloudant 这样的面向文档的数据库中近似 JOIN 是完全微不足道的。例如,如果你想建模一个一对 n 的关系,你可以将所有 n 个相关的文档放入它们所属的文档中。在您的情况下,您应该将所有 store_branch 放在相关商店中。如果满足以下条件,则此策略可行:

  • 文档不会变得太大而影响性能。这可以通过使用数据库视图或显示函数来缓解。
  • 内部文档中的信息只出现在那里,不需要复制到其他文档中,或者这样的复制对于您的应用程序来说是可以接受的。
  • 文档没有同时更新。如果是这样,可能会出现需要由应用程序解决的不必要的冲突。

如果上述策略不适用,您可以使用一种更接近于在关系数据库中解决此问题的方法:您可以为每个 "relational table" 创建一个文档。在您的情况下,您还应该创建一个包含字段的文档:(商店 book_id、store_branch_id 和价格)。

这篇 Cloudant 文章非常深入地解释了这些可能性:Cloudant - Join the fun, have fun with JOINs