5

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

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

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

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

在此处输入图像描述

现在,如果我想使用 JPA 将这一切保存到数据库,我需要如何查看“review”对象(唯一实例)和“customer”之间的关系?

  • 客户可以有多个他/她需要填写的评论。
  • 某个评论对象需要许多客户填写(但这是一个具有一定构建 [reviewlines and feedbackscores] 的评论对象)并且对他来说是唯一的。

也许我认为它很复杂,但构建它的最佳方法是什么?

4

3 回答 3

1

尝试以下操作:

ER/类图

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

我正在尝试阅读您的评论,并且我认为您想要实现一个系统,您可以在其中捕获许多“规则” Review(我猜,但示例可能是评论最多可达n行,必须至少有m CustomerReviews才能Review获得一定程度的质量)。如果确实如此,我创建了一个ReviewTemplate类:

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

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

编辑:对特定问题的回答

你怎么看复制?我可以创建一个具有指定属性的实体 ReviewTemplate。在这个实体中,将有与审查线和反馈分数的关系。

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

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

    1. (如果合适)使用来自的默认值填充CustomerReview属性feedbackScoreReviewTemplate
    2. 根据需要实例化CustomerReviewLine记录

如果您遵循这种方法,则无需在ReviewTemplate 和之间添加关系CustomerReviewLines

例如,当我声明客户 1 到 4 需要填写评论时,需要创建 4 个特定的“对象”来保存信息,还需要创建 4 组所需的评论和反馈分数,以便他们都可以保存信息.

绝对地。

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

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

  1. 编写 SQL DDL 语句来创建表、列、主键和外键,以及
  2. 编写一个用@entity注解表示的 Java 类。在类中,您还需要使用 or 注释 id(主键)@id以及与@OneToManyor的关系@ManyToOne(它们在注释中的附加参数也需要设置)。

现在,在 JPA 方面,您可以执行以下操作:

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

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

编辑2:附加问题

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

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

我终于想明白了ReviewLineCustomer我原以为这是一个输入文本行的地方,包括CustomerReview. 我现在相信这ReviewLine是一个Customer被问到的具体问题,并且Customer提供了一个反馈分数。

有了这种理解,这里是一个更新的 ER/Class 图。

在此处输入图像描述

请注意,有一些重大变化 - 还有几个表:

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

    1. 在创建时,可以自定义aReview及其而不影响orReviewLinesReviewTemplateReviewLineTemplate
    2. 随着时间的推移,ReviewTemplate可以ReviewLineTemplate更新、编辑和不断改进,而不会改变Customer已经回答的问题。如果直接CustomerFeedbackScore链接到ReviewLineTemplate,则编辑ReviewLineTemplate将更改Customer已回答的问题,从而使 feedbackScore 静默无效。
  3. FeedbackScore 已移至 和 之间的连接ReviewLineCustomerReview

请注意,此模型是完全非规范化的,这使得它更“正确”但更难为其构建 GUI。一个常见的“优化”可能是引入:

  • 10(比如说)列在ReviewTemplate并通过Review调用。reviewLine1reviewLine10
  • 10(比如说)列 onCustomerReview调用feedbackScore1through feedbackScore10
  • 删除ReviewTemplateLine,ReviewLineCustomerReviewLine

这样做是不规范的,并且可能会引入一系列其他问题。YMMV

于 2013-02-14T02:44:59.680 回答
1

数据的结构总是取决于需求,从来不存在“一劳永逸”的解决方案。那么,您需要最大化的原子性还是高性能的数据系统?

最快和最简单的解决方案不是使用数据库,而是使用哈希表。在您的情况下,您可能有 3 个用于客户、评论的哈希表,可能还有另一个用于 n:n 关系的哈希表。或者,如果您使用的是数据库,则可以将一组 review-primary-keys 存储在 customer 表的一个字段中。

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

  • 客户(unique_ID,...)
  • 审查(unique_ID,...)
  • Customer_Review (customer_ID, review_ID, ...) --> n:n-relationship

Customer_Review 描述了客户和评论之间的 n:n 关系。但是,如果每个评论可能只有一个客户,您将这样做:

  • 客户(unique_ID,...)
  • 审查(pk:unique_ID,fk:customer_ID,...)--> 1:n-relationship

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

于 2013-02-14T11:02:54.833 回答
0

你需要一个多对多关系:

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

因此,您的数据库架构中将有 3 个表:客户、评论和一个带有客户 ID 和评论 ID 的联结表。

参见维基百科:多对多

于 2013-02-11T23:20:20.867 回答