使用MVC結構和Business Object/DAO體系結構處理業務應用程序。對於任何正常的業務對象,CRUD功能都非常簡單。但處理像「客戶就是用戶」這樣的親子關係的最佳方式是什麼?反映DAO中繼承關係的最有效方法?
我知道下面的類涉及:
User, UserDAO, Customer, CustomerDAO
的Customer
類可以從User
就好了繼承,但你如何最好的DAO CRUD功能體現呢?
使用MVC結構和Business Object/DAO體系結構處理業務應用程序。對於任何正常的業務對象,CRUD功能都非常簡單。但處理像「客戶就是用戶」這樣的親子關係的最佳方式是什麼?反映DAO中繼承關係的最有效方法?
我知道下面的類涉及:
User, UserDAO, Customer, CustomerDAO
的Customer
類可以從User
就好了繼承,但你如何最好的DAO CRUD功能體現呢?
Martin Fowler的記錄了幾個Object-Relational Structural Patterns,這可能有助於:
1)Single Table Inheritance:代表類的繼承層次爲具有對各種類別的所有字段列一個表。
例如Employee
和Customer
都從User
繼承,並且都存儲在用戶表中,並具有確定特定記錄所代表的用戶類型的列。
2)Class Table Inheritance:表示每個類有一個表的類的繼承層次結構。
例如Employee
和Customer
都從User
繼承,並且有三個表來表示它。用戶表存儲所有用戶共有的屬性。 Employee表有一個指向User表的指針,只存儲與Employees相關的屬性。 Customer表同樣如此。
3)Concrete Table Inheritance:表示層次結構中每個具體類具有一個表的類的繼承層次結構。
例如Employee
和Customer
都從類摘要User
繼承,並且有兩個表來表示這個。客戶表和員工表。每個表格存儲用戶共同的信息,但也存儲獨特的屬性。
您可以在CustomerDAO中擁有一個UserDAO實例。您需要與User和Customer表進行交互以覆蓋基類和子類列。例如:
public class CustomerDAO
{
UserDAO userDao;
// ... initialization ...
public void update(Customer customer)
{
// ... first execute update of customer table ...
userDao.update(customer); // Should be able to pass Customer to UserDAO due to inheritance
}
public void insert(Customer customer)
{
// First insert a row in the User table so that the ID of the user can be determined.
userDao.insert(customer);
// ... Now execute insertion of row into Customer table ...
}
public void delete(Customer customer)
{
// ... first delete Customer row ...
// Now delete base class User row.
userDao.delete(customer);
}
}
當然,每個客戶操作應該包含在一個事務中,以便更新用戶和客戶表不會獨立失敗。
你有兩個表 - 用戶和客戶嗎?我會很驚訝。我會認爲一個`user`表有`user_type`字段。然後只有一個VO,即「用戶」。如果`user.isCustomer()`爲真,那麼它就是客戶。所以,要麼你不應該使用兩個表,或者你不應該使用繼承。 – Nishant 2011-02-12 19:37:49
@Nishant:那根本不是真的。如果客戶有額外的數據,用戶不這樣做,你會用不相關的列混淆用戶表。用兩個表實現繼承肯定是可行的。 – 2011-02-12 20:10:51
@Matt我不是在講可行性,我更多地考慮設計。客戶是一個用戶 - 最好將他們都放在同一個表中。這將有助於搜索更有意義。如果您擔心混亂,請將無關數據外部化。創建一個單獨的表'customer_details`並將其與外鍵鏈接。在很多情況下,您可能希望將用戶轉換爲客戶。只是改變類型而不是在表格之間複製數據然後擦除前者更容易。只是我的2%。 – Nishant 2011-02-12 22:13:45