您将如何为客户建模>订单> ordertem>产品在NoSql数据库中?

时间:2012-12-15 23:51:06

标签: node.js mongodb couchdb database nosql

我目前正在学习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 个答案:

答案 0 :(得分:10)

为MongoDB设计架构时,一个重要的考虑因素不是您的数据,而是您将如何使用它。如果不弄清楚你将要做什么类型的读写(以及它们的性能如何),那么设计一个“最佳”模式可能很困难。

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

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

底线是你应该有三个集合:

产品
客户
订单

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

所有这些集合中的其他集合和确切字段取决于您的具体用例,但我看不到一个可行的场景,其集合数量少于这三个集合。

答案 1 :(得分:0)

Mongo使用的集合,你可以在某种程度上与“表格”相关联,所以你可以在这里拥有4个集合。但请注意,您无法将“订单”和“订单商品”组合成“订单”,因为您需要考虑每个条目可以更多地是您可以使用RDBMS实现的文档。

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

对于其中的任何一个,不要在一个查询中做太多事情,因为它并不总是可能。

这里的关键点是没有单一的“NoSQL”方法,不像RDBMS,其中SQL是统一者。 NoSQL商店的每个数据库和类型都有其优点和缺点,您需要确定最适合您的商品。

希望这有帮助。