我目前正在学习的Node.js和需要实现一个数据库。 所有的节点书籍似乎认为MongoDB是最好的解决办法,但我似乎无法让我的周围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的坚持,这两者都是兼容的节点呢?
设计MongoDB的架构时的一个重要考虑是不是你的数据是什么,但你会如何使用它。 如果没有制定什么类型的读取和写入你会做(以及如何高性能他们会),它可以是很难设计“最佳”模式。
有迹象表明,你可以考虑以避免这类问题的一些基本准则。 其中之一是避免设计其保持增长无限的文件。 这意味着你不应该嵌入到订单客户文档。 另一条规则是,那都不算事“利益”自己(或不上自己的存在)可能是更好嵌入。 这表明的OrderItems配不上自己的收藏,应该简单地作为订单的属性处理(这是它们是什么,其实)。
这种精确的运动是覆盖在MongoDB的开发人员培训,是架构设计的一个非常典型的例子。
底线是,你应该有三个类别:
制品
顾客
命令
订单将参考客户(可选非规范化的客户收集一些资料),他们会参考产品(的OrderItems的阵列它们含有)。
另外收藏,并在所有这些集合的具体领域取决于具体的使用情况,但我看不出一个可行的方案有比这三个集合少。
蒙戈使用集合,其中你能有所关联到“表”,所以你可以有4收藏在这里。 但是请注意,我们没有理由你不能结合“订单”和“订单项目”逼到“订单”,因为你需要考虑每个条目可以多文件,你可以用RDBMS的实现。
沙发是不同的,在那里你只需存储文档。 在这种情况下,你可能会标志和它是什么“类型”的文件每个文档。 然后,您可以创建视图功能,可以返回您通过地图需要的数据/减少。
与任何这些,不要太挂在一个查询中所做的一切,因为它并不总是可能的。
这里关键的一点是没有单一的“的NoSQL”的方法来此,不同于RDBMS其中SQL是统一者。 NoSQL的商店的每一个DB和类型都有加分和缺点,你需要确定你最适合的是什么。
希望这可以帮助。
文章来源: How would you model customer > order > ordertem > product in NoSql database?