关系和构建数据库

时间:2013-02-11 13:29:46

标签: java mysql jpa entity-relationship

对于练习,我需要构建类似的东西:

对于课程,我需要创建一个由某些评论和反馈评分组成的评论。

此审核对象(唯一实例)需要由客户列表填写。

根据评审的课程,评审将发生变化(例如,对于一门课程,评审专线和反馈评分的数量会发生变化)。每个客户可以注册多个课程,每个评审都是针对他的。

enter image description here

现在,如果我想使用JPA将所有内容保存到数据库中,我如何才能看到“审核”对象(唯一实例)和“客户”之间的关系?

  • 客户可以进行一次以上需要填写的评论。
  • 某个审核对象需要由许多客户填写(但这是一个具有特定版本的审核对象[reviewlines和feedbackscores])并且对他来说是独一无二的。

也许我认为这很复杂,但建立这个的最佳方式是什么?

3 个答案:

答案 0 :(得分:1)

尝试以下方法:

ER/Class diagram

我认为它涵盖了你的所有设计要点。

我正在尝试阅读您的评论之间的行,我认为您希望实施一个系统,您可以在其中捕获许多规则'对于Review(我猜测,但示例可能是评论可以达到 n 行,必须至少 m {{ 1 {}在CustomerReviews获得一定程度的质量之前)。如果确实如此,我创建了一个Review类:

  • ReviewTemplate将为您需要的每个值提供属性/列。这些属性/列在ReviewTemplate
  • 重复
  • 使用多个行填充Review,然后在ReviewTemplate中创建一行并将其链接到一个Course
  • ReviewTemplate需要Course复制时,Review中的字段会变为ReviewTemplate
  • 在Java中,使用复制的值实施Review的业务规则 - 而不是Review上的值。

为什么要复制这些值?好吧,我打赌,在某些时候,用户想要编辑ReviewTemplate表。如果是这样,ReviewTemplate对象使用已编辑的Review会发生什么? ReviewTemplates上的修改后的值是否会以某种方式使过去的ReviewTemplate无效并破坏您的业务逻辑?不,因为您已将规则值复制到Reviews,因此过去Review不会更改。

编辑:特定问题的答案

  

你怎么看重复?我可以使用指定的属性创建一个实体ReviewTemplate。在这个实体中,将与审核热线和反馈分数建立关系。

我认为每个Reviews都保留了特定'类型的原型值。 ReviewTemplate,其中可能包含默认的reviewLine(但可能没有意义)和默认的feedbackScore。创建Review时,您将执行以下操作:

  1. 实例化Review并使用Review
  2. 中的值填充
  3. 根据需要实例化尽可能多的ReviewTemplate个对象,将它们链接到相关的CustomerReview个对象(我从之前的评论中推断出这一步。也可以省略此步骤直到Customer自愿选择审核Customer

    1. (如果适用)使用Course
    2. 中的默认值填充CustomerReview属性feedbackScore
    3. 根据需要实例化ReviewTemplate条记录
  4. 如果您使用此方法,则无需在CustomerReviewLineReviewTemplate之间添加关系。

      

    当我例如说明客户1到4需要填写评论4特定的"对象"需要创建将保存信息,并且还需要创建4组所需的审阅行和反馈分数,以便他们都可以保存信息。

    绝对

      

    我只是不知道如何实现这是一个JPA结构,所以信息保存在db ...?

    JPA允许您以多种方式解决问题,但最佳做法是手动创建数据库模式和Java类(例如,请参阅https://stackoverflow.com/a/2585763/1395668)。因此,对于图中的每个实体,您需要:

    1. 编写SQL DDL语句以创建表,列,主键和外键,以及
    2. 编写一个用CustomerReviewLines注释表示的Java类。在课程中,您还需要使用@entity注释id(主键)以及与@id@OneToMany的关系(注释中的其他参数也可以设置)。
    3. 现在,在JPA方面,您可以执行以下操作:

      @ManyToOne

      如果在标准EJB会话Bean中编写,这将很好地处理,并且您将所有新记录提交到数据库中。

      编辑2:其他问题

      (我假设第二条评论完全取代第一条评论)

        

      因此,当我创建reviewtemplate并将其链接到一堆客户时,我将模板写入数据库并根据模板创建一组评论,但链接到特定客户以及他自己独特的评论和反馈评分。就像我现在看到的那样,每个评论(模板)的评论线(更多是问题或描述)是相同的,只是客户之间的分数变化

      我终于认为我理解ReviewTemplate template = course.getReviewTemplate(); //assuming the variable course Review review = new Review(); review.setCourse(course); review.setRuleOne(template.getRuleOne()); // Copy other properties here EntityManager em = // get the entity manager here em.persist(review); // Assume a set or list of customers for (Customer customer : customers) { CustomerReview cr = new CustomerReview(); cr.setReview(review); cr.setCustomer(customer); cr.setFeedbackScore(template.getDefaultFeedbackScore()); // set other CustomerReview properties here em.persist(cr); // You can create CustomerReviewLine here as well 。我认为这是ReviewLine输入Customer组成的文字行的地方。我现在认为CustomerReview是一个特定问题,ReviewLine被问及Customer提供反馈评分。

      根据这种理解,这是一个更新的ER /类图。

      enter image description here

      请注意,有一些重大更改 - 还有几个表:

      1. Customer提供了存储在ReviewLineTemplate
      2. 上的模板问题的位置
      3. ReviewTemplate被实例化/插入(这是特定Review的副本)时,ReviewTemplate将被复制为ReviewLineTemplates。复制操作允许两个重要功能:

        1. 在创建时,可以自定义ReviewLines及其Review,而不会影响ReviewLinesReviewTemplate
        2. 随着时间的推移,ReviewLineTemplateReviewTemplate可以更新,修改并不断改进,而无需更改ReviewLineTemplate已经回答的问题。如果Customer直接与CustomerFeedbackScore相关联,那么修改ReviewLineTemplate会改变ReviewLineTemplate已回答的问题,默默地使feedbackScore无效。
      4. FeedbackScore已移至CustomerReviewLine之间的联接表。

      5. 请注意,此模型已完全非规范化,这使其更加“正确”。但更难建立一个GUI。一个常见的优化'可能是要介绍:

        • 10个(比方说)CustomerReviewReviewTemplate上的列ReviewreviewLine1
        • 10个(比方说)reviewLine10上的列CustomerReviewfeedbackScore1
        • 删除feedbackScore10ReviewTemplateLineReviewLine表格

        这样做没有规范化,并且可能会引入一系列其他问题。 YMMV

答案 1 :(得分:1)

数据结构总是取决于要求,并且从不存在“一对一”的解决方案。那么,您需要最大化的atomiticy还是高性能数据系统?

最快和最简单的解决方案是不使用数据库,而是使用哈希表。在您的情况下,您可以为客户,审核提供3个哈希表,并且可能为n:n关系提供另一个哈希表。或者,如果您正在使用数据库,则只需将review-primary-keys数组存储在customer表的一个字段中。

但是,我们都在学校学习做原子性,所以让我们这样做(我只写主要/外键!):

  • 客户(unique_ID,...)
  • 评论(unique_ID,...)
  • Customer_Review(customer_ID,review_ID,...) - > N:N-关系

Customer_Review描述了客户和评论之间的n:n关系。但是,如果每次审核只有一个客户,你可以这样做:

  • 客户(unique_ID,...)
  • 评论(pk:unique_ID,fk:customer_ID,...) - > 1:N-关系

但是,我建议你需要学习ERM作为一个很好的起点:http://en.wikipedia.org/wiki/Entity_relationship_model

答案 2 :(得分:0)

你需要一个ManyToMany关系:

  • 一位客户 - >几条评论。
  • 一篇评论 - >几个客户。

因此,您的数据库架构中将有3个表:客户,审核以及包含客户ID和审核ID的联结表。

请参阅Wikipedia : Many to Many