首页 > 解决方案 > 如何解析微服务世界中书籍的作者姓名?

问题描述

所以我开始了一段微服务之路。我在网上花了几个小时试图让自己沉浸在这个话题中。

我还没有完全理解的一个概念是不使用 SQL 连接的想法,因此为作者和书籍拥有一个小型独立数据库。

所以我理解以下SQL:

BooksTable - id, name, authorid
AuthorsTable - id, name

select book.name, author.name from book 
join author on book.authorId = author.id

在 Node.js 世界中

index.js

app.get('/api/books' bookDomain.get());

bookDomain.js

exports.get = () => {
  const books = bookService.get();

  const authors = authorService.get();

  /*
    This is where I'm lost: how do you achieve the simple SQL 
    above? I'm assuming in the domain is where this information is 
    "joined"? am I correct?
  */
};

服务

Database1
**bookService.js**
database context

Database2
**authorService.js**
database context

预期数据(类似的东西,基本上我说 JSON 应该是返回类型)

[{
  book {
    "name": "Book 1",
    "author": "Author Name 1"
  }
},
{
  book {
    "name": "Book 2",
    "author": "Author Name 2"
  }
}]

标签: node.jsamazon-web-servicesaws-lambdamicroservices

解决方案


我至少可以想到三种方法来解决这个问题。

  1. 文档模型 NoSQL DB:考虑使用像 Mongo DB 这样的文档模型 NoSQL DB,而不是使用 SQL DB。因此,您可以使用像 Mongo 这样的文档 NoSQL DB,将您的书籍存储为文档类型BooksAuthors采用AuthorBooksBSON 格式,看起来几乎与您问题中的 JSON 相同。像 Mongo 这样的文档数据库的一个很好的特性是,您可以在Book文档中的 JSON 上设置索引Author,从而缩短查询时间。这在 Martin Fowler 的NoSQL Distilled(第 2.2 节和第 9 章)中得到了很好的讨论。
  2. 打破外键关系,以便由服务而不是数据库维护引用完整性:而不是依赖关系数据库为您强制执行引用完整性(通过维护外键)将数据库的访问限制为您的微服务和通过您的服务本身维护外键的完整性。Sam Newman 在第 84-85 页的Building Microservices中讨论了这种策略。
  3. 非规范化数据库:与其为书籍和作者分别设置两个表,不如将它们组合成一个非规范化表。因此,创建一个新表,其中您的书籍信息是重复的,并且作者信息对于每本书的每一行都是唯一的。它很丑。搜索现在有更大的搜索空间,但也很简单。例如,类似于以下格式:

    book_id | book_name              | book_author
    =====================================================
          1 | NoSQL Distilled        | Pramod J. Sadalage
    -----------------------------------------------------
          1 | NoSQL Distilled        | Martin Fowler
    -----------------------------------------------------
          2 | Building Microservices | Sam Newman

推荐阅读