三个表之间的关系:正确的查询和设计建议

时间:2017-05-18 11:47:10

标签: php mysql database-design relational-database

我有三个表(MySQL):

  1. families定义产品系列
  2. products定义产品
  3. families_products关联家庭和产品
  4. -------------------    --------------------    ------------------------
    | familyID | code |    | productID | code |    | familyID | productID |
    |----------|------|    |-----------|------|    |----------|-----------|
    |     1    |  p   |    |     1     |  p3  |    |    1     |     1     |
    |     2    |  a   |    |     2     |  a5  |    |    1     |     3     |
    |     3    |  e   |    |     3     |  p1  |    |    1     |     6     |
    -------------------    |     4     |  e7  |    |    2     |     2     |
                           |     5     |  a2  |    |    2     |     5     |
                           |     6     |  p4  |    |    3     |     4     |
                           --------------------    ------------------------
    

    我有两个问题:

    1. 此设计是否方便,或者最好放下families_products表,将familyID关系直接放入表products
    2. 如果有这样的设计,如果我有familyID,我该如何检索products->code?我编写了这个查询,但是如果我删除parents_products表,将familyID关系直接放入表产品中,如前所述,而不是第三个关系表,则可以使用像这样的查询结构。
    3. 'SELECT productID, code, img
       FROM products AS a
       INNER JOIN families_products AS b
       ON b.productID=a.productID
       WHERE b.familyID=' . $families[$key]["familyID"]
      

2 个答案:

答案 0 :(得分:0)

您的数据结构很好。

如果每个产品最多只有一个familyID,那么您应该将该系列放在products表中。如果产品可以属于多个系列,则应使用连接表(您的结构)。

至于你的查询,没关系。我会使用更好的表别名:

SELECT p.productID, p.code, ??.img
FROM products p INNER JOIN
     families_products fp
     ON f.productID = fp.productID
WHERE fp.familyID = ' . $families[$key]["familyID"]

答案 1 :(得分:0)

如果您的产品只属于一个产品系列,则可以跳过" familiy_product"表并将familiy_id直接添加到产品中。只有在产品可以分配给多个系列的情况下,您才需要"加入"表

只有两个表,SQL非常简单: select p.code from family f, product p where f.code ='xx' and p.family_id = f.id