2011-11-09 21 views
6

Ai đó có thể cho tôi ý tưởng cách tạo cấu trúc cơ sở dữ liệu này. Dưới đây là một ví dụ:Trường SQL có nhiều id của bảng khác

Table "countries": 
id, countryname 
1, "US" 
2, "DE" 
3, "FR" 
4, "IT" 

Bây giờ tôi có "sản phẩm" khác bảng và trong đó tôi muốn lưu trữ tất cả các quốc gia mà sản phẩm này có sẵn:

Table "products": 
id,productname,countries 
1,"product1",(1,2,4) // available in countries US, DE, IT. 
2,"product2",(2,3,4) // available in countries DE, FR, IT. 

Câu hỏi của tôi: thế nào Tôi thiết kế cấu trúc bảng trong "sản phẩm" để có thể lưu trữ nhiều quốc gia?

Ý tưởng tốt nhất của tôi là đặt một chuỗi được phân tách bằng dấu phẩy trong đó (ví dụ: "1,2,4"), sau đó chia chuỗi đó để tìm kiếm từng mục nhập. Nhưng tôi nghi ngờ rằng đây là cách tốt nhất để làm điều này?

EDIT: Cảm ơn tất cả vì sự giúp đỡ của bạn, tuyệt vời! Rất khó để chọn câu trả lời đúng, Cuối cùng tôi đã chọn Greg vì anh ấy đã chỉ cho tôi một lời giải thích JOIN và đưa ra một ví dụ về cách sử dụng nó.

Trả lời

9

Bạn cần một bàn giao cho rằng many-to-many mối quan hệ.

Table Country 
CountryID, CountryName 

Table CountryProduct 
CountryID, ProductID 

Table Product 
ProductID, ProductName 

Sau đó bạn Inner Join tất cả 3 bảng để có được danh sách các quốc gia & sản phẩm.

Select * From Country 
Inner Join CountryProduct On Country.CountryID = CountryProduct.CountryID 
Inner Join Product On CountryProduct.ProductID = Product.ProductID 
1

Bạn cũng có thể tạo bảng thứ ba countries_products với các trường country_id và product_id.

2

Without denormalizing, bạn sẽ cần phải thêm một bảng phụ

Table Product countries 
ProductID CountryID 
1   1 
1   2 
1   4... 
2

Điều bạn đang nói đến là chuẩn hóa. Bạn có cấu trúc nhiều thành phần, vì vậy bạn nên tạo một bảng khác để liên kết hai. Bạn sẽ không bao giờ (ok, khá nhiều không bao giờ) sử dụng các chuỗi phân cách để lưu trữ một danh sách các giá trị trong một cơ sở dữ liệu quan hệ.

Dưới đây là một ví dụ về các thiết lập:

product_countries table 

productid | countryid 
----------+----------- 
1   | 1 
1   | 2 
1   | 4 
2   | 2 
2   | 3 
2   | 4 

Bạn có thể sử dụng một chìa khóa nước ngoài để mỗi bảng khác, sau đó làm cho họ cả hai vào một khóa chính composite.

Sau đó bạn có thể nhận được một danh sách các sản phẩm hỗ trợ cho một ID đất nước như thế này:

SELECT * FROM products, product_countries 
WHERE products.id = product_countries.productid 
AND product_countries.countryid = $cid 
+0

tại sao không sử dụng kết nối? điều này luôn có vẻ hơi lạ với tôi – Flo

+0

Logic khi sử dụng 'JOIN' sẽ gây nhầm lẫn hơn cho một newbie SQL, mà OP rõ ràng là. Chắc chắn, một 'JOIN' cũng sẽ hoạt động, nhưng không có logic thì rõ ràng hơn và dễ hiểu hơn. – Polynomial

+0

Cảm ơn bạn và tất cả những người khác đã giúp đỡ !! Có, SQL-newbie ở đây. Một câu hỏi con: Câu lệnh SQL đó có vẻ chậm đối với tôi - giả sử tôi có 100000+ sản ​​phẩm, sẽ không mất nhiều thời gian để lặp qua product_countries? – marimba

1

phương pháp tốt nhất cho cơ sở dữ liệu quan hệ như sau:

Một bảng cho một số nước, chúng ta hãy nói country_id , country_desc (country_id là chính)

một bảng cho sản phẩm, giả sử product_id, product_desc và bao nhiêu cột tùy thích (product_id là chính)

nếu bạn chỉ có một quốc gia, chắc chắn là đủ để có khóa ngoại chỉ đến country_id trong mỗi hàng sản phẩm. Có khóa ngoại quốc khẳng định rằng có một quốc gia thực sự đang băm một quốc gia_id đề cập đến bảng quốc gia.

Trong trường hợp của bạn, bạn có một số quốc gia cho một sản phẩm, vì vậy thêm một riêng biệt bảng hiệp hội product_id, country_id

cả khóa chính và cả nước ngoài là tốt.

Các vấn đề liên quan