9

Tôi mới trong thiết kế cơ sở dữ liệu. Tùy chọn nào tốt hơn cho thiết kế cơ sở dữ liệu thuộc tính sản phẩm cho các cm? (Vui lòng đề xuất các tùy chọn khác).(Thiết kế cơ sở dữ liệu - thuộc tính sản phẩm): Tùy chọn nào tốt hơn cho thiết kế cơ sở dữ liệu thuộc tính sản phẩm?

tùy chọn 1: 1 bảng

products{ 
id 
product_name 
color 
price 
attribute_name1 
attribute_value1 
attribute_name2 
attribute_value2 
attribute_name3 
attribute_value3 
} 

phương án 2: 3 bảng

products{ 
id 
product_name 
color 
price 
} 

attribute{ 
id 
name 
value 
} 

products_attribute{ 
products_id 
attribute_id 
} 

Cảm ơn, Yosef

+0

Các thuộc tính có thay đổi thường xuyên không? Bạn có thường xuyên thêm/xóa những cái mới không? Nếu không thì sử dụng tùy chọn 1 với tên của các cột là tên thuộc tính. Nếu thuộc tính của bạn là năng động, sau đó sử dụng tùy chọn 2. Tất nhiên cho tùy chọn 2 bạn sẽ được thực hiện một hit hiệu suất. –

+0

Cũng như Bill nói nhìn vào câu trả lời trước đây của bạn và là một công dân tốt và chấp nhận những người làm việc cho bạn. (Chỉ cần nhấp chuột) –

+0

Tôi thêm phiếu bầu, cảm ơn vì đã nói với tôi.Ứng dụng web của chúng tôi là dinamic- nghĩa là mọi người dùng đều xác định vấn đề thuộc tính của mình với tùy chọn 2 rằng nó sẽ rất chậm và với tùy chọn 1 chúng tôi có thể cho tối đa 10 thuộc tính cho sản phẩm mà chúng tôi không biết tên và giá trị của nó xác định cho người dùng. – Yosef

Trả lời

22

Bạn đang mắc lỗi chung về thiết kế cơ sở dữ liệu, lưu trữ tên trong một cột và giá trị trong một cột khác. Đây không phải là một thiết kế cơ sở dữ liệu quan hệ.

Mỗi thuộc tính phải được đặt tên theo tên cột. Màu, trang, kích thước áo sơ mi, ngày xuất bản, phải là tên cột.

Nếu mỗi loại sản phẩm có một tập hợp thuộc tính riêng biệt, có các giải pháp khác. Xem câu trả lời của tôi cho:

Cũng xin đọc câu chuyện này: Bad CaRMa: Introducing Vision trước khi bạn thực hiện một cơ sở dữ liệu được thiết kế xung quanh cặp tên-giá trị như bạn đang làm.

+0

cảm ơn Bill, tôi cũng bỏ phiếu cho các câu hỏi khác của tôi, cảm ơn bạn đã cho tôi biết. – Yosef

+0

Xin chào Bill, tôi đã đọc Bạn liên kết Cảm ơn, Tôi có câu hỏi: Tại sao bạn thích sử dụng ** Thừa kế Bảng Lớp ** và không ** Thừa kế Bảng Đơn **? Vui lòng giải thích, Cảm ơn, Yosef – Yosef

+0

@Yosef: Với việc thừa kế bảng lớp, rõ ràng hơn là các nhóm cột đi cùng nhau. Ngoài ra, bạn có thể thêm bảng loại phụ mới bất kỳ lúc nào, với tập hợp các cột loại cụ thể của riêng mình, không cần phải thay đổi bảng cha có chứa các cột chung cho tất cả các loại phụ. Điều này là quan trọng đối với ví dụ cho MySQL, nơi 'ALTER TABLE' là một hoạt động tốn kém. –

1

đó phụ thuộc vào những gì bạn muốn từ cơ sở dữ liệu của bạn. Nếu tất cả các sản phẩm của bạn có cùng loại và có cùng thuộc tính thì bạn chỉ cần thực hiện một việc như sau:

sản phẩm {id: integer, product_name: string, color: string, attribute_name1: string, attribute_name2: string. ..}. Attribute_name {} phải là một từ có ý nghĩa, giống như "màu" (cũng là một thuộc tính).

+0

Không, chúng không giống nhau vì tôi thêm 2 trường: 1. tên 2. giá trị – Yosef

3

tôi nghĩ rằng việc thực hiện tốt nhất cho sản phẩm thuộc tính bạn có thể nhận được

Product_Tbl [ 
    ID 
    Name 
    more columns 
] 

Attribute_Tbl [ 
    ID 
    Att_Name 
] 

Product_Attribute_Tbl [ 
    Product_ID 
    Attribute_ID 
    Value 
] 

nếu sản phẩm của bạn không có các thuộc tính tương tự như bạn có thể sử dụng cấu trúc này

0

này bây giờ là một chủ đề cũ, nhưng suy nghĩ nó có thể là thú vị để suy nghĩ về cách này đã phát triển (đặc biệt là với tốc độ xử lý nhiều hơn có nghĩa là hiệu suất có thể được đánh bạc tại thời điểm).

Bạn đã bao giờ xem xét lưu trữ từng thuộc tính dưới dạng một mục riêng biệt trong bảng ...cho phép nói bảng "2", trong đó phím trở lại sản phẩm sẽ là một id:

Product (table 1) 
{ 
    Product ID 
    Product Name 
} 

    Tags (table 2) 
{ 
    Tag ID 
    Higher Level tag ID 
    Description 
    Value 
    Product ID 
} 

Và đó bảng này sẽ chứa cũng là một lĩnh vực được gọi là "mức độ cao hơn", do đó bạn có thể tìm thấy ID duy nhất trong bảng này thuộc tính nào đã được tạo ở cấp cao hơn cho sản phẩm cụ thể này. Bằng cách đó, bạn có một thứ gọi là "gắn thẻ omnilevel".

Hy vọng điều này sẽ giúp