我們假設應該從頭開始構建的應用程序的領域模型描述如下:域模型/ JPA實體模型是否應該創建設計良好的數據庫表結構?
一個人可能住在一個地址。一個人可以擁有多輛汽車。
如果我必須先設計數據庫,那麼我可能會想出下面的數據庫設計(規範化,級聯等,不應該爲我的具體問題扮演主要角色)。
Person (id, name)
Address (id, street, zip, city, person_id)
Car (id, manufacturer, yearBuilt, color, person_id)
我主要遵循標準設計的概念(例如,在該鏈路http://db.grussell.org/section006.html描述)。
正如您所看到的,地址表具有人員表的外鍵,因爲人地址關係可被視爲可選項。
一個人可以擁有多輛汽車的事實是通過將一個外鍵放在汽車表中的人身上來實現的。我認爲這是建模1..m關係的標準方式。
如果我不得不先設計領域模型,我可能會拿出以下設計:
public class Person {
private String name;
private Address address;
private List<Car> cars;
// Getters and setters
}
public class Address {
private String street;
private String zip;
private String city;
// Getters and setters
}
public class Car {
private String color;
private Date yearBuilt;
// Getters and setters
}
在該領域模型中,Person
類具有所有必要的關係。 Address
和Car
班不需要知道他們擁有的任何東西Person
。
我現在可以通過添加@Entity
併爲每個類提供@Id
屬性來將這些類轉換爲JPA實體。
@Entity
public class Person implements Serializable {
@Id
private Long id;
private String name;
@OneToOne
private Address address;
@OneToMany
private List<Car> cars;
public Person() { }
// Getters and setters
}
@Entity
class Address implements Serializable {
@Id
private Long id;
private String street;
private String zip;
private String city;
public Address() { }
// Getters and setters
}
@Entity
class Car implements Serializable {
@Id
private Long id;
private String color;
private Date yearBuilt;
public Car() { }
// Getters and setters
}
如果我的JPA提供者根據所提供的註釋創建表,創建以下數據庫結構:
Person (id, name, address_id)
Address (id, street, zip, city)
Car (id, manufacturer, yearBuilt, color)
Person_Car (person_id, car_id)
正如你所看到的,不對應於數據庫結構我想創建如果我必須先設計數據庫。我看到一些缺陷由JPA提供商創建的數據庫模型:
- 作爲人 - 地址關係是可選的,我將不得不把外鍵的人到地址表中,而不是相反。
- 作爲建模1..m關係的標準方法是將擁有類的外鍵放入詳細類中,我從來不會想出關係或關聯表。爲什麼我會想要如果關係不被其他屬性描述?
- 要將Person加入Car,JPA提供程序需要對關係或關聯表執行額外的連接。這是否會顯着降低性能?
我現在可以做的是爲JPA實體類提供附加字段和/或註釋,以爭取人們可能期望的數據庫結構。
是否需要爭取能夠創建預期數據庫結構的域模型/ JPA實體設計(就像使用了數據庫優先方法一樣)?如果是這樣,是否可以接受一個領域模型,它不同於直觀地創建的領域模型?在設計一個領域模型/ JPA實體模型時,有哪些優勢可以創建某種「最佳實踐」數據庫結構?
你的問題往往過於寬泛,因爲它有這麼多的子問題...... – MWiesner