所以我开始了一段微服务之路。我在网上花了几个小时试图让自己沉浸在这个话题中。
我还不太了解的一个概念是不使用 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"
}
}]
最佳答案
我至少可以想到三种方法来解决这个问题。
- 文档模型 NoSQL DB: 考虑使用像 Mongo DB 这样的文档模型 NoSQL DB,而不是使用 SQL DB。因此,不是一个关系数据库,其中包含
Books
和Authors
之类的表以及一个AuthorBooks
表,它们都连接在一对外键上 - 你可以使用像 Mongo 这样的文档 NoSQL DB,其中您的书籍以文档类型存储,采用 BSON 格式,看起来与您问题中的 JSON 几乎相同。像 Mongo 这样的文档数据库的一个很好的特性是,您可以在Author
上的Book
文档内的 JSON 上设置索引,从而缩短查询时间。这在 NoSQL Distilled 中有很好的讨论。作者:Martin Fowler(第 2.2 节和第 9 章)。 - 打破外键关系,以便由服务而不是数据库维护参照完整性: 而不是依赖关系数据库为您强制执行参照完整性(通过维护外键)将数据库的访问限制在您的微服务中,并通过您的服务本身维护外键的完整性。 Sam Newman 在 Building Microservices 中讨论了这种策略。第 84-85 页。
- 非规范化 DB: 与其为书籍和作者分别设置两个表,不如将它们组合成一个 denormalized table .因此,创建一个新表,其中您的书籍信息是重复的,并且作者信息对于每本书的每一行都是唯一的。它很丑。搜索现在有更大的搜索空间,但也很简单。例如,类似于以下格式:
book_id | book_name | book_author
=====================================================
1 | NoSQL Distilled | Pramod J. Sadalage
-----------------------------------------------------
1 | NoSQL Distilled | Martin Fowler
-----------------------------------------------------
2 | Building Microservices | Sam Newman
关于node.js - 如何解析微服务世界中书籍的作者姓名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51541318/