【问题标题】:How to represent a 3-way relation with JPA?如何表示与 JPA 的三向关系?
【发布时间】:2011-02-22 18:41:23
【问题描述】:

一个用户可能有多个标签和链接。然后,用户将标签(或更多)与链接相关联。怎么代表后来的关系?

解决方案可以是多对多关系 btw 用户并与可选属性标签链接。 http://en.wikibooks.org/wiki/Java_Persistence/ManyToMany#Mapping_a_Join_Table_with_Additional_Columns 在这种情况下,用户和标签的关系最好是“虚拟的”。

我没有看到任何替代方案?

PS:我使用了谷歌书签术语,因为它非常符合我的情况。

【问题讨论】:

    标签: java database-design jpa


    【解决方案1】:

    如果我的理解是正确的,那么你在following的情况下:

    替换三元关系

    当三元关系发生在 他们应该永远是一个 ER 模型 在完成模型之前删除。 有时关系可以是 替换为一系列二进制 链接成对的关系 原来的三元关系。

                              
    (来源:grussell.org

                                                       Figure
    

    :三元关系示例

    • 这可能会导致一些信息丢失 - 不再清楚 哪个销售助理卖了一个客户 特定产品。
    • 尝试将三元关系替换为实体类型和 一组二元关系。

    关系通常是动词,所以 将新实体类型命名为 关系动词改写为名词。

    • 关系销售可以变成实体类型销售。

                              
    (来源:grussell.org

                                                   图 : 替换三元关系

    • 因此可以将销售助理链接到特定客户,并且两者都可以 他们出售特定的 产品。
    • 此过程也适用于更高阶的关系。

    这就是我的建议:引入一个新实体。

    【讨论】:

    • 所以我的用户有 Link_Tag,而 Link_Tag 涉及 Link ,并且涉及 Tag。还有更能透露意图的名字吗?另外,我的理解是,每次销售助理向客户销售产品时,我:销售实体都会被实例化为客户和产品的属性。然后将其添加到进行销售的销售助理的销售集合中。对吗?
    • 你会让产品和客户一起成为销售的主要关键,从而导致另一个“假”实体吗?否则,例如,您最终可能会进行没有销售助理的销售。除非,我们使这些属性不可为空。这是更好的解决方案吗?
    【解决方案2】:

    只要有

    class Label {
        ...
        @OneToOne
        private Link link;
    }
    

    和/或

    class Link {
        ...
        @OneToOne
        private Label label;
    }
    

    【讨论】:

      【解决方案3】:

      为用户链接添加一个可为空的“标签”将只允许每个链接使用一个标签。如果你只需要一个标签,那就去吧。

      如果每个链接需要多个标签,则引入第三个实体,例如

      class LinkLabel
      {
         @ManyToOne
         Link link;
      
         @ManyToOne
         Label label;  
      
         @ManyToOne
         User user;
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 2015-08-08
        • 2018-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-27
        相关资源
        最近更新 更多