2011-02-12 63 views
2

使用MVC結構和Business Object/DAO體系結構處理業務應用程序。對於任何正常的業務對象,CRUD功能都非常簡單。但處理像「客戶就是用戶」這樣的親子關係的最佳方式是什麼?反映DAO中繼承關係的最有效方法?

我知道下面的類涉及:

User, UserDAO, Customer, CustomerDAO 

Customer類可以從User就好了繼承,但你如何最好的DAO CRUD功能體現呢?

+0

你有兩個表 - 用戶和客戶嗎?我會很驚訝。我會認爲一個`user`表有`user_type`字段。然後只有一個VO,即「用戶」。如果`user.isCustomer()`爲真,那麼它就是客戶。所以,要麼你不應該使用兩個表,或者你不應該使用繼承。 – Nishant 2011-02-12 19:37:49

+1

@Nishant:那根本不是真的。如果客戶有額外的數據,用戶不這樣做,你會用不相關的列混淆用戶表。用兩個表實現繼承肯定是可行的。 – 2011-02-12 20:10:51

+0

@Matt我不是在講可行性,我更多地考慮設計。客戶是一個用戶 - 最好將他們都放在同一個表中。這將有助於搜索更有意義。如果您擔心混亂,請將無關數據外部化。創建一個單獨的表'customer_details`並將其與外鍵鏈接。在很多情況下,您可能希望將用戶轉換爲客戶。只是改變類型而不是在表格之間複製數據然後擦除前者更容易。只是我的2%。 – Nishant 2011-02-12 22:13:45

回答

10

Martin Fowler的記錄了幾個Object-Relational Structural Patterns,這可能有助於:

1)Single Table Inheritance:代表類的繼承層次爲具有對各種類別的所有字段列一個表。

例如EmployeeCustomer都從User繼承,並且都存儲在用戶表中,並具有確定特定記錄所代表的用戶類型的列。

2)Class Table Inheritance:表示每個類有一個表的類的繼承層次結構。

例如EmployeeCustomer都從User繼承,並且有三個表來表示它。用戶表存儲所有用戶共有的屬性。 Employee表有一個指向User表的指針,只存儲與Employees相關的屬性。 Customer表同樣如此。

3)Concrete Table Inheritance:表示層次結構中每個具體類具有一個表的類的繼承層次結構。

例如EmployeeCustomer都從類摘要User繼承,並且有兩個表來表示這個。客戶表和員工表。每個表格存儲用戶共同的信息,但也存儲獨特的屬性。

6

您可以在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); 
    } 
} 

當然,每個客戶操作應該包含在一個事務中,以便更新用戶和客戶表不會獨立失敗。