Mysql thiết kế model Products trong eCommerce thế nào? Làm sao giống Mongodb

Nội dung bài viết

Video học lập trình mỗi ngày

Thiết kế hệ thống eCommerce trong mysql như thế nào để đơn giản những câu query như chúng ta thiết kế ở bài trước của Mongodb. Đó là vấn đề chúng ta sẽ tìm hiểu trong bài viết này.

Thiết kế database hệ thống eCommerce

Như những bài viết trước chúng ta đã hiểu trái tim của một hệ thống Thương Mại Điện Tử (TMĐT) tập trung ở 4 dữ liệu đó là users, products, orders, inventories. Đi sâu vào 4 dữ liệu này, thì có lẽ là products là một trong những table xử lý phức tạp nhất. Vì sao lại là products mà không phải là những dữ liệu khác trong 4 loại hình mà chúng ta đã đề cập trên? Để trả lời câu hỏi thì chúng ta đi một thống kê thực tế như sau.

Với 1 store thì có ít nhất 50 sản phẩm chính trên shopee và mỗi sản phẩm chính có ít nhất 5 sản phẩm con. Bạn hãy để ý, mỗi sản phẩm đều có variants. Như vậy thì products chính là một trong những dữ liệu tập trung nhiều nhất và nó phải nhất quán.

Design model products mongodb

Nếu như các anh chị đã xem bài viết về Cách thiết kế eCommerce trong Mongodb thì các anh chị cũng đã hiểu về cách thiết kế của noSQL việc mở rộng rất là dễ và query cũng nhanh. Anh chị có thời gian thì nên xem lại để có thêm một cách tham khảo cho những lần sau. Tôi có thể review qua một chút.

Mở trang Shopee lên các bạn cũng thấy, danh sách các sản phẩm sẽ có những attritube chung, nhìn qua thì có thể là title, price, stock, và assets hay gọi là image. Như vậy hình dung đó là những thuộc tính chung, để list ra homepage. Ta có model sau với việc sử dung mongodb.

model product

{
    _id: ObjectId(),
    p_title: 'title',
    p_price: 1000,
    p_stock: 2000,
    p_assets: [ {img}, {img}]
}

Nhưng phải hiểu sâu hơn là mỗi sản phẩm có những thuộc tính riêng biệt ví dụ ta lấy sản phẩm quần áođiện thoại. Thì đương nhiên sẽ có những attrs khác nhau như điện thoại thì có wifi, camera, solution... Nhưng quần áo thì không, nhưng sẽ có những loại khác như chất liệu, size, color... vây thì ở mongodb chúng ta sẽ làm như thế này. Nhớ xem lại bài viết trước để có cách nhìn kỹ hơn. Sau đây là cách mô tả ngắn gọn.

clothes

{
    _id: ObjectId(),
    p_title: 'clothes',
    p_price: 1000,
    p_stock: 2000,
    p_assets: [ {img}, {img}],
    p_attrs: [
        {
            k: 'fabric',
            v: 'cotton'
        },
        {
            k: 'size',
            v: 'XL'
        },
        {
            k: 'color',
            v: 'Red'
        }
    ]
}

mobile

{
    _id: ObjectId(),
    p_title: 'iPhone 14',
    p_price: 1000,
    p_stock: 2000,
    p_assets: [ {img}, {img}],
    p_attrs: [
        {
            k: 'camera',
            v: '32mp'
        },
        {
            k: 'solution',
            v: '4k'
        },
        {
            k: 'wifi',
            v: 'yes'
        }
    ]
}

Khi lấy list thì đơn giản chúng ta chỉ cần lấy những thuộc tính chung. Còn khi đi vào chi tiết của một sản phẩm thì chúng ta sẽ có những thuộc tính thêm.

Đó chính là thiết kế database cho dự án thương mại nếu dựa trên Mongodb. Vậy ở mysql thì sao? Chúng ta đi tiếp.

Design model products mysql

Đầu tiên chúng ta cũng tạo một table products cũng có những thuộc tính chung như trên. Nhưng trước hết để hiểu được phần này, bạn phải biết vê mysql ở level thứ 2. Và nếu nhưng chúng ta viết theo lv1 thì mỗi bảng chúng ta sẽ có 100 thuộc tính. Như vậy thì rất tai hại, có thể hiểu diều này có thể gây ra các vấn đề sau:

  1. Chi phí triển khai cao, đồng thời yêu cầu phát triển front-end và back-end và gỡ lỗi mỗi khi thêm sản phẩm, điều này gây lãng phí thời gian và nhân lực.

  2. Có thể có ngày càng nhiều trường trong cơ sở dữ liệu, và hầu hết các mục trong nhiều trường là không cần thiết và cần được thiết lập NULL, dẫn đến lãng phí nhiều bộ nhớ.

Và muốn biết vì sao thì chúng ta nên có một video nói về chuyện này, vì nó vượt qua sự đơn giản của vấn đề này. Chúng ta nên tập trung vào vấn đề này mà thôi.

model product

create table `p` (
    `p_id` int(11) UNSIGNED NOT NULL auto_increment,
    `p_title` varchar(50) default NULL,
    `p_price` int(1) NOT NULL,
    `p_stock` int(1) NOT NULL,
    PRIMARY KEY (`p_id`),
    UNIQUE KEY `p_title` (`p_title`)
);

Giờ chúng ta sẽ insert 2 dữ liệu đó là clothermobile giống như trên:

insert into p(p_title, p_price, p_stock) values ("clothes", 1000, 2100),("iPhone 14 128GB", 1000, 2000);

Bây giờ chúng ta lấy danh sách home page ra là như thế này.

select * from p;

Tiếp tục mỗi sản phẩm có nhiều thuộc tính khác nhau như ở trên, và lúc này tôi cũng đã nói là nhược điểm nếu bạn cứ thêm attr khi có thêm một loại sản phẩm khác. Nhược điểm rất nhiều, thì có một mô hình EAV magento hay còn gọi là magento eav attribute được thiết kế cho trường hợp này, nhưng tôi nói thêm nó cũng có nhiều nhược điểm và gây tranh cãi khá nhiều với model này. Chính vì vậy, tôi phải nói trước các bạn cứ tìm hiểu cho kỹ để áp dụng với đúng tình hình kinh doanh của mình hay công ty. Chứ đừng đi vào vết xe đổ gây tranh cãi không hay. Ở đây tôi chỉ là người giới thiệu design model. Còn muốn tôi đưa ra chính kiến thì tôi quyết luôn đó là dùng mongodb cho trường hợp này.

Quay lại vấn đề chính thì tiếp đến chúng ta phải thiết kế một table dùng để lưu trữ attrs mà mô hình EAV magento đã trình bày.

Để hiểu một vấn đề cặn kẽ thì các Anh Chị nên xem video để có thể nhìn một cách rõ ràng hơn. Xin mời: Sử dụng MySQL thiết kế model Products

Có thể bạn đã bị missing