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

jon*_*bbs 5 database couchdb mongodb nosql node.js

我目前正在学习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)
Run Code Online (Sandbox Code Playgroud)

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

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 
Run Code Online (Sandbox Code Playgroud)

如果我能看到一个如何在NoSQL数据库中工作的例子,那么我可能会开始"得到它".

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

Asy*_*sky 10

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

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

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

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

产品
客户
订单

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

所有这些集合中的进一步集合和确切字段取决于您的特定用例,但我看不到可行方案的集合数量少于这三个集合.