9

我目前正在学习 Node.JS,需要实现一个数据库。所有的 Node 书籍似乎都认为 MongoDB 是最好的解决方案,但我似乎无法理解 Mongo 和 Couch 等 NoSql 数据库,我是一名 MS SQL Server 人!

因此,我知道您可以将结构化数据保存为记录 (JSON),但我不确定您如何使用以下(简化)表为典型的电子商务应用程序建模......

customers (id, name, address)
orders (id, customerID, orderDate)
orderItems (id, orderID, productID)
products (id, title, description, image)

所以,通常我会写一个这样的查询(但显然更好优化)......

SELECT Customers.name, Products.title 
FROM (orders INNER JOIN customers ON orders.customerID = customers.id)
INNER JOIN orderItems ON orderItems.orderID = orders.id 
INNER JOIN products ON orderItems.productID = products.id 

如果我能看到一个如何在 NoSQL 数据库中工作的示例,那么我可能会开始“了解它”。

或者,我最好还是坚持使用 MSSQL Server 或 MySql,它们都与 Node 兼容?

4

2 回答 2

16

在为 MongoDB 设计模式时,一个重要的考虑因素不是您的数据是什么,而是您将如何使用它。如果不弄清楚您将执行哪种类型的读取和写入(以及它们的性能如何),可能很难设计一个“最佳”模式。

您可以考虑一些基本准则以避免遇到问题。其中之一是避免设计不断无限增长的文档。这意味着您不应该将订单嵌入到客户文档中。另一个规则是,那些本身不“感兴趣”的东西(或者它们自己不存在)可能最好嵌入。这表明 orderItems 不值得拥有自己的集合,而应该简单地被视为订单的属性(实际上它们就是这样)。

MongoDB 开发人员培训中涵盖了这个确切的练习,这是一个非常典型的模式设计示例。

底线是您应该拥有三个集合:

产品
客户
订单

订单将引用客户(可选地对客户集合中的一些信息进行非规范化处理)并且他们将引用产品(在他们将包含的 orderItems 数组中)。

更多集合和所有这些集合中的确切字段取决于您的特定用例,但我看不出比这三个集合更少的可行方案。

于 2012-12-16T03:49:20.990 回答
0

Mongo 使用集合,您可以在某种程度上将其与“表格”相关联,因此您可以在此处拥有 4 个集合。但请注意,没有理由不能将“订单”和“订单项”组合成“订单”,因为您需要考虑每个条目都可以更像是您可以使用 RDBMS 实现的文档。

Couch 不同,您只需在其中存储文档。在这种情况下,您可以用它是什么“类型”的文档来标记每个文档。然后,您可以创建可以通过 map/reduce 返回所需数据的视图函数。

对于其中任何一个,不要太执着于在一个查询中做所有事情,因为这并不总是可能的。

这里的关键点是没有单一的“NoSQL”方法来解决这个问题,这与 SQL 是统一器的 RDBMS 不同。每种数据库和 NoSQL 存储类型都有其优点和缺点,您需要确定最适合您的是什么。

希望这可以帮助。

于 2012-12-16T00:39:50.677 回答