有人可以告诉我如何创建这个数据库结构。 这是一个例子:
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解释,并给出了一个如何使用它的例子。答案 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
两个键都是主要的,也都是外来的。