【问题标题】:SQL field with multiple id's of other table具有其他表的多个 id 的 SQL 字段
【发布时间】:2011-12-25 03:16:19
【问题描述】:

谁能告诉我如何创建这个数据库结构。 这是一个例子:

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 解释,并举例说明了如何使用它。

【问题讨论】:

    标签: sql row field


    【解决方案1】:

    您需要该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
    

    【讨论】:

      【解决方案2】:

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

      比方说,一张桌子供各国使用 country_id, country_desc (country_id 是主要的)

      一个产品表,比方说 product_id、product_desc 和任意数量的列(product_id 是主要的)

      如果您确定只有一个国家/地区,那么在每个产品行中有一个指向 country_id 的外键就足够了。拥有一个外键就表明存在一个实际的国家,它的 country_id 是指国家表。

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

      两个主键和两个外键。

      【讨论】:

        【解决方案3】:

        你说的是标准化。您有一个多对多结构,因此您应该创建另一个表来链接两者。您永远不应该(好吧,几乎永远不要)使用分隔字符串将值列表存储在关系数据库中。

        这是一个设置示例:

        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
        

        【讨论】:

        • 为什么不使用连接?这对我来说总是有点奇怪
        • 使用 JOIN 的逻辑对于 SQL 新手来说会更加混乱,OP 显然是这样。当然,JOIN 也可以,但没有它,逻辑会更清晰,更容易理解。
        • 感谢您和所有其他人的帮助!是的,这里是 SQL 新手。一个子问题:那个 SQL 语句对我来说似乎很慢 - 假设我有 100000 多个产品,那么迭代 product_countries 不是需要很长时间吗?
        • 不应该。由于两列都是主键和外键,它们将被索引。
        【解决方案4】:

        如果不进行反规范化,您需要添加一个额外的表

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

        【讨论】:

          【解决方案5】:

          您还可以使用字段 country_id 和 product_id 创建第三个表 countries_products。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-06-26
            • 1970-01-01
            • 1970-01-01
            • 2018-02-02
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多