2014-03-26 54 views
0

這是我的數據庫設計:類設計領域模型與審計跟蹤

Person 
------------------------------------------------ 
ID    UINT NOT NULL, 
Name    VARCHAR(200) NOT NULL, 
DOB    DATE NOT NULL, 
Email    VARCHAR(100) NOT NULL 


Person_History 
------------------------------------------------ 
ID    UINT NOT NULL, 
PersonID   UINT NOT NULL, 
Name    VARCHAR(200) NOT NULL, 
DOB    DATE NOT NULL, 
Email    VARCHAR(100) NOT NULL 
AuditID   UINT NOT NULL 


Audit 
------------------------------------------------ 
ID    UINT NOT NULL, 
UserID   UINT NOT NULL,    -- Who 
AffectedOn  DATE NOT NULL,    -- When 
Comment   VARCHAR(500) NOT NULL  -- Why 

我想是可以重用大多數的人歷史課的人的代碼,因爲屬性被複制。用現在的方式,我應該分解和封裝人物嗎?這樣,我可以使用組合,而不必在Person類和PersonH​​istory類之間重複代碼?

+0

你真的指Java或可能是JavaScript嗎? –

回答

0

我相信你應該避免在我看來,您的複製數據庫列應該是:

Person 
------------------------------------------------ 
ID    UINT NOT NULL, 
Name    VARCHAR(200) NOT NULL, 
DOB    DATE NOT NULL, 
Email    VARCHAR(100) NOT NULL 


Person_History 
------------------------------------------------ 
ID    UINT NOT NULL, 
PersonID   UINT NOT NULL, 
AuditID   UINT NOT NULL 


Audit 
------------------------------------------------ 
ID    UINT NOT NULL, 
UserID   UINT NOT NULL,    -- Who 
AffectedOn  DATE NOT NULL,    -- When 
Comment   VARCHAR(500) NOT NULL  -- Why 

如果你使用JPA你的類可以這樣映射:

@Entity 
@Table(name = "PERSON") 
public class Person { 

@Id 
@Column(name = "ID", unique = true, nullable = false) 
private Integer id; 

@Column(name = "DOB") 
@Temporal(TemporalType.DATE) 
private Date birthDate; 

@Column(name = "EMAIL") 
private String email; 

@OneToMany(mappedBy="person", fetch=FetchType.LAZY, cascade=CascadeType.ALL) 
private List<PersonHistory> personHistories; 

// getters and setters... 

} 


@Entity 
@Table(name = "PERSON_HISTORY") 
public class PersonHistory { 

@Id 
@Column(name = "ID", unique = true, nullable = false) 
private Integer id; 

@ManyToOne(fetch=FetchType.LAZY) 
@JoinColumn(name="ID_PERSON", nullable=false) 
private Person person; 

@ManyToOne(fetch=FetchType.LAZY) 
@JoinColumn(name="ID_AUDIT", nullable=false) 
private Audit audit; 

// getters and setters... 

} 


@Entity 
@Table(name = "AUDIT") 
public class Audit { 

@Id 
@Column(name = "ID", unique = true, nullable = false) 
private Integer id; 

@Column(name = "AFFECTED_ON") 
@Temporal(TemporalType.DATE) 
private Date affectedOn; 

@Column(name = "COMMENT") 
private String comment; 

@ManyToOne(fetch=FetchType.LAZY) 
@JoinColumn(name="ID_USER", nullable=false) 
private User user; 

// getters and setters... 

} 

所以在您的對象模型中,您將能夠訪問人員歷史記錄中的人員數據。

+0

不會阻塞人員表格,因爲會混合使用當前和歷史數據? – blacktie24

+0

在您的數據庫人員表中,只會存儲與人員相關的字段,因此每個實體都將在其自己的表中存儲無關冗餘的數據,跨表格沒有重複的列,您能否指出一個這樣的混合示例當前和歷史數據? – guilhebl