如何在NoSql数据库中建模客户>订单>订单条目>产品?

10

我目前正在学习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 兼容,对吧?

2个回答

21
在设计MongoDB模式时,重要的考虑因素不是你的数据是什么,而是你将如何使用它。如果没有弄清楚你将执行什么类型的读写操作(以及它们的性能如何),那么设计“最佳”模式可能会很困难。
有一些基本准则可以考虑,以避免出现问题。其中一个是避免设计文档不断增长的情况。这意味着您不应该将订单嵌入到客户文档中。另一个规则是那些自身“不感兴趣”或不存在的事物可能更适合被嵌入。这表明orderItems并不值得拥有自己的集合,而应该简单地将其视为订单的属性(实际上就是这样)。
这个确切的练习在MongoDB开发者培训中有涵盖,是模式设计的一个相当典型的例子。
底线是你应该有三个集合:
产品
顾客
订单
订单将引用客户(可选地从客户集合中去规范化一些信息),并且它们将引用产品(在包含的orderItems数组中)。
进一步的集合和所有这些集合中的确切字段取决于您的具体用例,但我看不到少于这三个集合的可行情况。

0

Mongo使用集合,你可以将其与“表”有些相似,因此你可以在这里拥有4个集合。但请注意,你可以将“订单”和“订单项”合并为“订单”,因为你需要考虑每个条目可以更像是一个文档,这是关系型数据库管理系统无法实现的。

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

对于任何一种方法,不要过于纠结于在一个查询中完成所有操作,因为这并不总是可能的。

关键点在于,与SQL作为统一器的关系型数据库管理系统不同,这里没有单一的“NoSQL”方法。每个数据库和NoSQL存储类型都有其优点和缺点,你需要确定最适合你的是什么。

希望这能帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接