2011-11-09 19 views
6

有人可以给我一个想法如何创建这个数据库结构。 下面是一个例子:其他表的多个ID的SQL字段

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

现在我有另一个表“产品”,并在那里我想用来存储所有的国家,本产品可用:

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. 

我的问题: 怎么办我在“产品”中设计表结构以便能够存储多个国家/地区?

我最好的想法是在那里放置一个逗号分隔的字符串(即“1,2,4”),然后分割该字符串以查找每个条目。但我怀疑这是做到这一点的最佳方式吗?

编辑:谢谢大家的帮助,太棒了!很难选择正确的答案, 我最终选择了格雷格斯,因为他指出我要加入一个解释并举例说明如何使用它。

回答

9

你需要为many-to-many关系的交集表。

Table Country 
CountryID, CountryName 

Table CountryProduct 
CountryID, ProductID 

Table Product 
ProductID, ProductName 

然后你Inner Join所有3个表格,让您的国家&产品的名单。

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

您还可以创建country_products字段为country_id和product_id的第三个表。

2

没有反规范化,您将需要添加额外的表

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

你说的是规范化。你有一个多对多的结构,所以你应该创建另一个表来链接这两个结构。你永远不应该(好吧,几乎从不)使用分隔字符串来存储关系数据库中的值列表。

这里是设置的例子:

product_countries table 

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

您可以使用外键彼此表,然后让他们都到复合主键。

然后,您可以得到支持的产品列表,一个国家ID是这样的:

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

为什么不使用连接?这对我来说总是看起来有点奇怪 – Flo

+0

使用'JOIN'的逻辑会让SQL新手感到困惑,而OP新手显然是这样。当然,一个'JOIN'也可以工作,但如果没有它,逻辑就会更清晰,更容易理解。 – Polynomial

+0

谢谢你和所有其他人的帮助!是的,这里是SQL新手。一个子问题:SQL语句对我来说似乎很慢 - 假设我有100000多种产品,是否需要很长时间来遍历product_countries? – marimba

1

关系数据库的最佳方法是:对六国的

一个表,让我们说 COUNTRY_ID ,country_desc(country_id是主要的)

产品的一个表,比方说 product_id,product_desc和尽可能多的列(product_id是主要的)

如果您确实只有一个国家/地区,那么在每个产品行中都有一个指向country_id的外键即可。有一个外键声称有一个实际的国家being country_id提到国家表。

你的情况,你有几个国家的产品,所以添加一个单独的关联表 PRODUCT_ID,COUNTRY_ID

两个键一次和外国也是如此。

相关问题