2013-02-11 195 views
5

对于锻炼; Tibial我需要建立类似:关系,并建立数据库

为一疗程,我需要创建一个编造出来的某些reviewlines和feedbackscores的审查。

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

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

enter image description here

现在怎么办,我需要看到“审查”对象(唯一的实例)和“客户”如果我想使用JPA拯救这一切的分贝之间的relationsship?

  • 一个客户可以有一个以上的评论,他/她需要让我们填写。需要通过许多客户填写
  • 一定审核对象(但这是有一定积累的评论对象[reviewlines和反馈评分])和独特的他。

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

回答

1

尝试以下操作:

ER/Class diagram

我认为这是覆盖所有的设计要点。

我正在尝试阅读您的评论之间的线条,我认为你想要实现一个系统,为Review捕获一些'规则'(我猜测,但例子可能是评论可以必须至少CustomerReviewsReview获得某种程度的质量之前)必须至少有n行。如果事实确实如此,我已经创建了一个​​类:

  • ​​将有属性/列的每个值,你将需要。这些属性/列Review
  • 复制填充​​与行数,然后在Course创建行和当Course需要Review复制了从田间地头将其链接到一个​​
  • 在​​不是价值观 -​​到Review
  • 在Java中,使用复制值实现业务规则Review

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

编辑:特定问题的答案

你怎么看的复制?我可以用指定的属性创建一个实体ReviewTemplate。在这个实体中,将会有评论和反馈评分的关系。

我看到每个​​作为的Review特定的“类型”,这也许会包括默认reviewLine控股典型值(但可能没有什么意义)和默认feedbackScore。当您创建Review,你会做以下几点:

  1. 实例化Review,并与值填充从​​
  2. 实例化,因为你需要尽可能多的CustomerReview对象,将它们链接到相关Customer对象(我推断这个步骤从以前的评论。这也可能是有意义的省略这一步,直到Customer自愿选择以回顾Course

    1. (如果appropr莱特)从​​
    2. 实例化CustomerReviewLine记录适当

如果按照这种方法,你不需要添加​​和CustomerReviewLines之间的关系填充CustomerReview属性feedbackScore使用默认值。

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

绝对。

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

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

  1. 写SQL DDL语句来创建表,列,主键和外键和
  2. 写与@entity注释标记的Java类。在课程中,您还需要使用@id以及与@OneToMany@ManyToOne(注释中的其他参数也要设置)之间的关系对注册ID(主键)进行注释。现在

,在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里面写的,这都将很好的交易,你将有你所有的新记录致力于数据库。

EDIT 2:其它问题

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

所以,当我创建一个reviewtemplate,我把它链接到了一堆客户我将模板写入数据库,并根据模板创建一系列评论,但与特定客户以及他自己的独特评论和反馈评分相关联。就像我现在看到它的reviewline(更多问题或详细描述)是(一个模板)每次审查一样,它仅仅是客户

我终于想我明白ReviewLine之间改变了比分。我曾经以为它是一个地方,Customer输入的文本行包括CustomerReview。我现在认为ReviewLine是一个具体问题,Customer被询问,并且哪个Customer提供了反馈评分。

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

enter image description here

注意,有一些显著的变化 - 有几个表:

  1. ReviewLineTemplate为模板问题的地方被存储在​​
  2. Review是实例化/插入(这是特定的​​的副本),ReviewLineTemplates被复制为ReviewLines。复制操作允许两个重要的特点:

    1. 在创作中,ReviewReviewLines可以在不影响​​或ReviewLineTemplate
    2. 久而久之,​​和ReviewLineTemplate可以更新,编辑和不断改进定制, 而不改变Customer已经回答了的问题。如果CustomerFeedbackScore直接链接到ReviewLineTemplate,那么编辑ReviewLineTemplate将会改变Customer已回答的问题,从而悄悄地使feedbackScore无效。
  3. FeedbackScore已移至ReviewLineCustomerReview之间的连接表。

请注意,这个模型是完全非规范化的,这使得它更“正确”,但更难建立一个GUI。一个常见的 '优化' 可能是介绍:在​​和Review通过reviewLine10称为reviewLine1

  • 10(说)列。
  • CustomerReview上的10(说)列被称为feedbackScore1feedbackScore10
  • 卸下ReviewTemplateLineReviewLineCustomerReviewLine

否则不被标准化,并且可以引入的一组其它的问题。 YMMV

+0

你如何看到重复?我可以用指定的属性创建一个实体ReviewTemplate。在这个实体中,将会有评论和反馈评分的关系。当我例如陈述客户1到4需要填写评论需要创建4个特定的“对象”来保存信息,并且还需要创建4套所需的评论和反馈评分,以便他们都可以保存我刚才的信息不知道如何实现这是一个JPA结构,所以信息保存在分贝...? – 2013-02-14 23:50:07

+0

首先thx答复。我还没有和你在一起。我创建了一个类/实体reviewTemplate。 te模板之间的差异是评论和反馈评分的数量和值。根据线的数量,我可以用指定的行数和模板的值(例如name,startdate,..)创建一个评论。为什么我不需要在评论和行之间创建关系。行不在审查和每个对象的独特,所以我需要链接这些,并写入分贝,所以我可以检索他们?我希望这是有道理的 – 2013-02-15 13:52:36

+0

因此,当我创建reviewtemplate并将其链接到一群客户时,我会将模板写入数据库,并根据模板创建一系列评论,但与特定客户以及他自己的独特评论和反馈评分。就像我现在看到的那样,每条评论(模板)的评论线(更多的是一个问题或描述)是相同的,只是客户之间的评分发生了变化。 – 2013-02-15 14:00:35

0

你需要一个多对多的关系:

  • 一个客户 - >若干评论。
  • 一个审查 - >几个客户。

因此,您的数据库模式中将包含3个表格:客户,审阅以及包含客户ID和审阅ID的联结表。

Wikipedia : Many to Many

+0

这样做的问题是,如果我建立与revieuwlines和feedbackscores进行审查。这个评审对象需要由顾客填写。但是每个客户都需要填写他自己的评论对象。 – 2013-02-12 10:01:25

+0

你的问题在哪里?交接表将允许2个操作:获得与特定客户联系的评论,以及获得需要填写特定评论的客户。 – Jonathan 2013-02-12 11:05:12

+0

例如:我创建了一个包含5条评论和反馈评分的评论对象。此评论需要由客户1至4填写。我创建了另一个评论对象,其中包含3条评论和反馈评分。该评审需要由客户1至3填写。对于每位客户,具体评审都是独一无二的。这不像一本书可以有很多作者,作者有很多书(这里的书保持不变)。在这种情况下,具体审查需要由特定客户填写。这不是一个与许多客户相关的评论 – 2013-02-12 19:07:32

1

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

最快和最简单的解决方案将不使用数据库,但哈希表。在你的情况下,你可以为客户提供3个哈希表,查看,也可能是n:n关系的另一个哈希表。或者,如果您使用的是数据库,则可以将review-primary-key的数组存储在customer表中的一个字段中。

然而,我们都在学校里学做原子,所以让我们做到这一点(我只是写了主/外键!):

  • 客户(UNIQUE_ID,...)
  • 评论( UNIQUE_ID,...)
  • Customer_Review(CUSTOMER_ID,REVIEW_ID,...) - > N:N关系

的Customer_Review介绍了N:客户和评论之间的正关系。但是,如果每个审核可能只有一个客户,你会是这样做的:

  • 客户(UNIQUE_ID,...)
  • 评论(PK:UNIQUE_ID,FK:CUSTOMER_ID,...) - > 1:n的关系

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