2013-02-11 237 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