具有其他表的多个id的SQL字段

时间:2011-11-09 08:58:50

标签: sql row field

有人可以告诉我如何创建这个数据库结构。 这是一个例子:

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”),然后拆分该字符串以查找每个条目。但我怀疑这是最好的方法吗?

编辑:谢谢大家的帮助,太棒了!很难选择正确的答案, 我最终选择了Gregs,因为他向我指了一个JOIN解释,并给出了一个如何使用它的例子。

5 个答案:

答案 0 :(得分:10)

您需要有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 :(得分:2)

如果没有非规范化,您需要添加一个额外的表

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

答案 2 :(得分: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

答案 3 :(得分:1)

您还可以制作第三个包含country_id和product_id字段的countries_products。

答案 4 :(得分:1)

关系数据库的最佳方法如下:

一张表格,比方说 country_id,country_desc(country_id是主要的)

一个产品表,让我们说 product_id,product_desc和任意数量的列(product_id是主要的)

如果您确实只有一个国家/地区,那么在每个产品行中都有一个指向country_id的外键就足够了。有一个外键声称有一个实际的国家正在使用country_id来引用国家/地区表。

在您的情况下,您有多个国家/地区的产品,因此请添加单独的关联表 product_id,country_id

两个键都是主要的,也都是外来的。