2012-12-15 12 views
5

Tôi hiện đang học Node.JS và cần triển khai cơ sở dữ liệu. Tất cả các cuốn sách Node dường như nghĩ MongoDB là giải pháp tốt nhất nhưng tôi dường như không thể có được đầu của tôi xung quanh cơ sở dữ liệu NoSql như Mongo và Couch, tôi là một anh chàng MS SQL Server!Bạn làm cách nào để mô hình khách hàng> đặt hàng> ordertem> sản phẩm trong cơ sở dữ liệu NoSql?

Vì vậy, tôi hiểu rằng bạn có thể giữ cho dữ liệu có cấu trúc như hồ sơ (JSON) nhưng tôi không chắc chắn làm thế nào bạn muốn mô hình một ứng dụng thương mại điện tử điển hình với các bảng (đơn giản) sau ...

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

Vì vậy, bình thường tôi muốn viết một truy vấn như thế này (nhưng tốt hơn được tối ưu hóa rõ ràng) ....

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 

Nếu tôi có thể thấy một ví dụ về cách này sẽ làm việc trong một cơ sở dữ liệu NoSQL sau đó tôi có thể bắt đầu " hiểu rồi".

Ngoài ra, tôi có tốt hơn khi gắn bó với máy chủ MSSQL hoặc MySql, cả hai đều tương thích với Node?

Trả lời

8

Một cân nhắc quan trọng khi thiết kế lược đồ cho MongoDB không phải là dữ liệu của bạn là gì, nhưng cách bạn sẽ sử dụng nó. Nếu không làm việc ra loại đọc và viết bạn sẽ làm (và làm thế nào biểu diễn họ sẽ được) nó có thể khó khăn để thiết kế một lược đồ "tối ưu".

Có một số nguyên tắc cơ bản mà bạn có thể xem xét để tránh gặp sự cố. Một trong số đó là tránh thiết kế tài liệu mà không ngừng phát triển. Điều đó có nghĩa là bạn không nên nhúng đơn đặt hàng vào tài liệu khách hàng. Một nguyên tắc khác là những thứ không phải là "sở thích" của riêng họ (hoặc không tồn tại một mình) có lẽ tốt hơn là được nhúng. Điều này cho thấy rằng orderItems không xứng đáng với bộ sưu tập của riêng mình và chỉ nên được coi là thuộc tính của các đơn đặt hàng (thực tế là chúng là gì).

Bài tập chính xác này được đề cập trong đào tạo nhà phát triển MongoDB, là một ví dụ khá điển hình về thiết kế lược đồ.

Điểm mấu chốt là bạn phải có ba bộ sưu tập:

Sản phẩm
Khách hàng
Orders

Đơn đặt hàng sẽ tham khảo khách hàng (tùy chọn denormalizing một số thông tin từ bộ sưu tập của khách hàng) và họ sẽ tham khảo các sản phẩm (trong mảng của orderItems chúng sẽ chứa).

Các bộ sưu tập khác và các trường chính xác trong tất cả các bộ sưu tập này tùy thuộc vào trường hợp sử dụng cụ thể của bạn, nhưng tôi không thể xem kịch bản khả thi để có ít bộ sưu tập hơn ba bộ sưu tập này.

0

Mongo sử dụng các bộ sưu tập mà bạn có thể tương quan phần nào với "bảng", vì vậy bạn có thể có 4 bộ sưu tập tại đây. Nhưng lưu ý không có lý do gì bạn không thể kết hợp "các đơn đặt hàng" và "các đơn đặt hàng" thành "đơn đặt hàng", vì bạn cần xem xét từng mục nhập có thể nhiều hơn một tài liệu mà bạn có thể đạt được với RDBMS.

Ghế là khác nhau, nơi bạn chỉ cần lưu trữ tài liệu. Trong trường hợp này, bạn có thể gắn cờ từng tài liệu với "loại" của tài liệu. Sau đó, bạn có thể tạo các chức năng xem có thể trả lại dữ liệu bạn cần thông qua bản đồ/giảm.

Với bất kỳ cách nào trong số này, đừng quá hung hăng khi làm mọi thứ trong một truy vấn vì không phải lúc nào cũng có thể.

Điểm mấu chốt ở đây là không có cách tiếp cận "NoSQL" duy nhất cho điều này, không giống như RDBMS trong đó SQL là trình thống nhất. Mỗi DB và loại cửa hàng NoSQL đều có những nhược điểm và nhược điểm của nó, và bạn sẽ cần phải xác định những gì phù hợp nhất với bạn.

Hy vọng điều này sẽ hữu ích.