与MYSQL / Doctrine的N到N到N的关系

时间:2015-10-22 09:50:55

标签: mysql sql symfony doctrine-orm doctrine

想象一下,你有三种物体类型:人物,篮子和水果。

每个人有0到N个篮子,每个篮子有1到N个水果。篮子和水果的顺序无关紧要。多人可以连接到同一个篮子,同样适用于篮子和水果。

典型的查询是:

  • 基于(随机)选择一种或多种水果:哪些篮子是这些水果选择的子集。 e.g:

    Selection: [apple, banana]
    
    Basket1:   [apple] - matches
    Basket2:   [banana] - matches
    Basket3:   [apple, banana] - matches
    Basket4:   [apple, orange] - does not match
    
  • 哪些人获得了上述查询匹配的购物篮。

    Person1:   [Basket1, Basket3, Basket4]
    Person2:   [Basket2]
    
    Selection: [apple, banana]
    
    Results:   [Person1, Basket1]
               [Person1, Basket3]
               [Person2, Basket2]
    
  • 列出一个人的篮子和水果

我对这个数据结构建模的想法如下:

TABLE persons
-------------
id
name


TABLE fruits
-------------
id
name


TABLE persons_baskets (N-N)
------------------------------
person_id
basket_id


TABLE baskets_fruits (N-N)
------------------------------
basket_id
fruit_id

大气压。 basket ID是一个随机整数,以避免在并行事务期间发生冲突。其他ID会自动递增。

问题:

  • 这是一种建模数据的好方法,还是一个额外的表格,可以保存一列(id),这是一种更好的方法。
  • 如何在学说中实现这一点?我看到的唯一方法是将baskets实体添加为单独的表,因为doctrine中需要每个实体的唯一标识符

1 个答案:

答案 0 :(得分:3)

额外的购物篮表会更好。在您的解决方案中,basket_id是一个外键,但您没有与之关联的主键(id_basket或id_pk_basket)。 另外一个表格使得向篮子添加数据(如篮子大小)也更容易。