Theo tôi thấy, bạn có thể giải quyết điều này theo một trong hai cách:
Danh mục là một loại sản phẩm đặc biệt
Điều này có nghĩa là đối với bất kỳ sản phẩm nhất định nào trong cơ sở dữ liệu của bạn, nó chứa khóa ngoại trỏ đến cùng một sản phẩm bảng. Sản phẩm là sản phẩm chỉ khi không tồn tại sản phẩm có khóa ngoại bằng với id của sản phẩm nói trên. Nói cách khác, nếu nó không có sản phẩm theo nó, nó là một sản phẩm.
Điều này sẽ đơn giản hóa mọi thứ một chút. Các sản phẩm cho các thuộc tính sẽ có mối quan hệ một-nhiều và do đó, các danh mục của bạn cũng có mối quan hệ một-nhiều vì chúng cũng là các sản phẩm. Thêm một tài sản vào một danh mục sẽ dễ dàng như thêm một tài sản vào một sản phẩm trong chương trình của bạn. Tải tất cả các thuộc tính có nghĩa là kết hợp các thuộc tính của sản phẩm với các thuộc tính của sản phẩm danh mục được liên kết và cho đến khi bạn tiếp cận một sản phẩm danh mục không có cha mẹ.
Ứng dụng thương mại điện tử của bạn sẽ cần tạo sự khác biệt này, nhưng nếu bạn có khả năng tải các sản phẩm của một danh mục, thì đó không phải là mất hiệu suất để biết bạn đang giao dịch với một danh mục hoặc sản phẩm. Nó cũng tự cho mình tìm kiếm thời trang cây theo cấp độ sản phẩm vì mỗi sản phẩm (danh mục) sẽ mở ra một danh sách các sản phẩm phụ mà không cần phải làm thêm.
Nhược điểm của điều này tất nhiên là thông tin bổ sung có trong sản phẩm không có ý nghĩa đối với một danh mục sẽ tạo ra các trường không sử dụng vụng về trong sản phẩm. Mặc dù giải pháp này sẽ linh hoạt hơn trong ứng dụng của bạn, nhưng nó cũng hơi trực quan hơn.
Mối quan hệ nhiều-nhiều
Sản phẩm không còn trong mối quan hệ tổng hợp với tài sản. Bạn tạo một bảng ProductProperty với các khóa ngoại của cả bảng sản phẩm và bảng thuộc tính liên kết cả hai. Tương tự, bạn có một bảng danh mục có mối quan hệ nhiều-nhiều với bảng thuộc tính và bảng CategoryProperty với các khóa ngoại của cả bảng danh mục và bảng thuộc tính.
Bản thân sản phẩm sẽ có mối quan hệ nhiều-một với danh mục, cho phép bạn chủ yếu tạo một danh sách các thuộc tính duy nhất liên quan đến cả sản phẩm và danh mục thông qua tuyên bố chọn chính thức.
Từ quan điểm của cơ sở dữ liệu, điều này chắc chắn là sạch sẽ và linh hoạt hơn. Ứng dụng của bạn có thể có thể thực hiện phần lớn mà không cần giao dịch trực tiếp với CategoryProperty hoặc ProductProperty nếu truy vấn được thực hiện đúng. Tuy nhiên, bạn cũng không nên coi danh mục hoặc sản phẩm là chủ sở hữu của tài sản. Nó phải là thực thể riêng của nó trong chương trình của bạn. Điều này cũng có nghĩa là việc quản lý các tài sản nói trên sẽ là vấn đề tạo ra tài sản đó, sau đó liên kết nó với một danh mục hoặc một sản phẩm theo hai bước riêng biệt. Chắc chắn công việc nhiều hơn giải pháp đầu tiên, nhưng không có nghĩa là khó khăn hơn.
Ngoài ra, bạn cũng sẽ phải thực hiện kiểm tra bổ sung khi xóa danh mục hoặc sản phẩm nếu bất kỳ thuộc tính nào của nó đang được sử dụng bởi người khác (không giống như giải pháp đầu tiên mà bạn có thể loại bỏ một cách an toàn tất cả các thuộc tính liên quan của sản phẩm / danh mục cụ thể) .
Phần kết luận
Trong bối cảnh chuyên nghiệp, tôi sẽ đi thêm danh mục dặm và khoảng cách từ sản phẩm và sản phẩm từ tài sản bằng cách sử dụng phương pháp nhiều-nhiều. Sẽ không có khả năng trùng lặp dữ liệu, và theo một nghĩa nào đó, sẽ dễ dàng hơn để coi mỗi ba người này là thực thể riêng của mình. Tuy nhiên, không có nghĩa là giải pháp đầu tiên là một giải pháp tồi vì nó cũng cho phép bạn viết một ứng dụng đơn giản hơn. Chỉ cần biết rằng nếu bạn nghĩ rằng cuối cùng bạn có thể cần phải chuyển từ giải pháp này sang giải pháp khác, thì có lẽ đó chỉ là lợi ích tốt nhất của bạn để chọn giải pháp thứ hai.
Chúc may mắn!