Thiết kế NoSQL ecommerce: Schema website ForCat Shop - Viblo
Giới thiệu:
MongoDB là một hệ quản trị cơ sở dữ liệu NoSQL phổ biến được sử dụng để lưu trữ dữ liệu phi cấu trúc và linh hoạt. Nó cung cấp khả năng mở rộng cao, hiệu suất tốt và dễ sử dụng, khiến nó trở thành lựa chọn lý tưởng cho nhiều ứng dụng hiện đại. Bài viết này sẽ hướng dẫn bạn cách xây dựng cơ sở dữ liệu NoSQL cho MongoDB, bao gồm thiết kế schema đầy đủ và sơ đồ schema. Chúng ta sẽ lấy ví dụ về website bán hàng thương mại điện tử, bạn có thể tham khảo website tại: https://www.forcatshop.com/
1. Các bước Thiết kế Schema:
B1: Xác định các yêu cầu:
Bước đầu tiên là xác định các yêu cầu của ứng dụng của bạn. Điều này bao gồm các loại dữ liệu bạn cần lưu trữ, các mối quan hệ giữa các dữ liệu và các truy vấn bạn cần thực hiện.
B2. Xác định các collection:
MongoDB sử dụng các collection để lưu trữ dữ liệu. Mỗi bộ sưu tập tương tự như một bảng trong cơ sở dữ liệu quan hệ, nhưng nó có thể lưu trữ dữ liệu phi cấu trúc.
B3. Thiết kế fields:
Mỗi fields trong bộ sưu tập là một đối tượng JSON lưu trữ dữ liệu cho một thực thể duy nhất. Cấu trúc của tài liệu nên phù hợp với các yêu cầu của ứng dụng của bạn.
B4. Xác định các mối quan hệ:
MongoDB hỗ trợ các mối quan hệ nhúng và tham chiếu để liên kết các tài liệu với nhau.
2. Thiết kế Schema:
Hầu hết với những trang thương mại điện tử sẽ có 3 collection chúng ta cần quan tâm như sau.
2.1. Schema Product
Xét 1 Product cần các yêu cầu sau:
Yêu cầu | Cách giải quyết |
---|---|
Các thông tin cơ bản như: Name,... | Để các trường như bình thường |
Thông tin chi tiết kỹ thuật: chiều dài, rộng, cao,xuất sứ, chất liệu,... | Để trường là một mảng chứa các object. Mỗi object sẽ có hai thuộc tính là {name, value} |
1 sản phẩm có nhiều biến thể có giá khác nhau | Đối với một số sản phẩm như vòng cổ sẽ có phân loại như màu sắc chất liệu, có khi thì biến thể này dc giảm giá, nhưng biến thể khôgn giảm giá. Mỗi loại sẽ có giá tiền khác nhau. Ta chỉ cần tạo ra trường thông tin variants chứa các mảng object, mỗi object lưu giá trị riêng biệt của từng giá trị như màu sắc, chất liệu, kích thước, giá tiền là được |
Danh sách các bình luận: mongoDB chỉ cho phép 1 collection có tối đa 16Mb, việc chứa hết toàn bộ review trên collection Product là không thể | Tham khảo từ trang web chính thức của mongoDB, để tránh One to Squillions, tức là danh sách bình luận là mảng vô hạn, nó luôn tăng dần theo thời gian, nên chúng ta cần tạo 1 collection Reviews để chứa được các bình luận của sản phẩm |
Cần có 1 truy vấn nhanh có thể hiển thị ra 10 bình luận gần nhất trong một lần tải trang | Chúng ta có thể nghĩ sẽ truy vấn trên collection Reviews để lấy dữ liệu bình luận cho sản phẩm, đây là một cách, nhưng nó không tối ưu. Cho dù chúng ta truy vấn bằng Id, hay limit dữ liệu trả về là một con số nào đó (ví dụ 10) nhưng mongoDB vẫn phải truy vấn hết toàn bộ dữ liệu trên collection. Hãy tưởng tượng có 1 triệu dữ liệu trên collection Reviews, thời gian truy vấn sẽ rất là lâu. Cách để giải quyết đó chính là tạo một trường currentReviews chứa 10 reviews gần nhất, khi người dùng tải trang sản phẩm thì họ cx có thể thấy các bình luận một cách nhanh nhất. Nếu như người dùng muốn tìm các bình luận lâu hơn thì bắt buộc phải chờ :<< |
Ta có thiết kê Schema Product như sau: Các biến thể sẽ được thể hiện như sau: Các thông số kỹ thuật thể hiển như sau:
2.2. Schema User
Xét 1 User cần các yêu cầu sau:
Yêu cầu | Cách giải quyết |
---|---|
Các thông tin cơ bản như: Username, password, name, age, ... | Để các trường như bình thường |
Thông tin địa chỉ: Tỉnh, huyện, xã, ... | Để các trường là object |
Phân quyền: admin/customer | Tạo một thuộc tính role để xác tđịnh người dùng |
Giỏ hàng: Danh sách các sản phẩm | Với noSQL ta có thể cho các danh sách sản phẩm trong giỏ hàng của người dùng ngay trong collection User, thay vì tạo một table Cart như SQL |
Đơn hàng gần đây: Cần truy vấn nhanh để ra được danh sách các đơn hàng gần đây | Tạo một biến currentOrder để chứa các đơn hàng gần nhất, phục vụ cho truy vấn |
Ta có thiết kê Schema User như sau:
2.3. Schema Order
Xét 1 Order cần các yêu cầu sau:
Yêu cầu | Cách giải quyết |
---|---|
Thông tin địa chỉ: Tỉnh, huyện, xã, ... | Để các trường là object |
Thông tin người nhận, mua có thể khác so với tên tài khoản của họ. Ví dụ như tên tài khoản là NunNun, nhưng họ muốn đặt đồ cho Mèo Con với số điện thoại khác | Tạo trường object order_buyer để lưu |
Đơn này do ai xử lý | Tạo trường staff_id để trỏ tới người nhân viên đó |
Đơn hàng có nhiều sản phẩm | Tạo một trường chứa mảng thông tin các sản phẩm, bao gồm: số lượng đặt mua, đơn giá. Lưu ý: đơn giá ở trong này phải bằng giá tiền lúc họ đặt, chứ không phải giá hiện tại trên web. Ví dụ: họ đặt trong lúc giảm giá là 90k (giá gốc 150k) thì trong đơn giá ghi trong đơn hàng phải là 90k |
Tương tự với collection Order, ta có thiết kê Schema User như sau:
3. Bảng thiết kế đầy đủ
Bảng thiết kế cho một website thương mại điện tử đơn giản như sau:
4. Kết luận
Các phương pháp thiết kế trên đây chỉ mang tính chất tham khảo, hãy lựa chọn phương pháp tổ chức thật tốt để phục vụ cho website của bạn nhé. Nếu như bạn có cách thiết kế tốt hơn, hãy chia sẻ nhé!!!
All rights reserved