2011-02-12 2 views
2

MVC 구조 및 Business Object/DAO 아키텍처를 사용하는 비즈니스 응용 프로그램에서 작업. 일반 비즈니스 객체의 경우 CRUD 함수는 매우 간단합니다. 하지만 "고객은 사용자"와 같은 부모 - 자식 관계를 처리하는 가장 좋은 방법은 무엇입니까?DAO의 상속 관계를 반영하는 가장 효과적인 방법은 무엇입니까?

User, UserDAO, Customer, CustomerDAO 

Customer 클래스는 단지 벌금 User에서 상속 할 수 있지만, 최선의 방법 당신은 DAO의 CRUD 기능이 반영 않습니다

나는 다음과 같은 클래스가 포함되어 있는지 알아?

+0

'사용자'와 '고객'의 두 테이블이 있습니까? 나는 놀랄 것이다. 나는'user_type' 필드를 가진'users' 테이블을 생각할 것입니다. 그런 다음 하나의 VO, 즉 '사용자'만 있습니다. 'user.isCustomer()'가 true이면 그것은 고객입니다. 따라서 두 테이블을 사용하지 말아야하며 상속을 사용하지 않아야합니다. – Nishant

+1

@Nishant : 전혀 사실이 아닙니다. 고객이 추가 데이터를 가지고 있지 않은 경우에는 관련없는 열이있는 User 테이블이 어수선하게 표시됩니다. 두 테이블을 사용하여 상속을 구현하는 것이 확실히 가능합니다. –

+0

@Matt 나는 타당성에 대해 말하지 않고, 나는 디자인에 대해 더 생각하고 있었다. 고객은 사용자이므로 두 테이블을 같은 테이블에 두는 것이 좋습니다. 검색에 도움이 될뿐만 아니라 나에게 더 의미가 있습니다. 복잡한 일이 걱정된다면 관련없는 데이터를 외부화하십시오. 별도의 테이블'customer_details'를 만들고 외부 키와 링크하십시오. 많은 시나리오에서 사용자를 고객으로 변환 할 수 있습니다.테이블간에 데이터를 복사 한 다음 데이터를 지우는 대신 형식을 변경하는 것이 더 쉽습니다. 그냥 내 2 %. – Nishant

답변

10

마틴 파울러는 도움이 될 수있는 몇 Object-Relational Structural Patterns를 기록했습니다

1) Single Table Inheritance는 : 다양한 클래스의 모든 필드에 대한 열이 하나의 테이블로 클래스의 상속 계층 구조를 나타냅니다.

EmployeeCustomer은 모두 User에서 상속되며 특정 레코드가 나타내는 사용자 유형을 결정하는 열과 함께 User 테이블에 저장됩니다.

2) Class Table Inheritance : 각 클래스에 대해 하나의 테이블을 가진 클래스의 상속 계층 구조를 나타냅니다.

EmployeeCustomer은 모두 User에서 상속되며이를 나타내는 세 개의 테이블이 있습니다. User 테이블은 모든 사용자에게 공통된 등록 정보를 저장합니다. Employee 테이블에는 User 테이블에 대한 포인터가 있으며 Employees와 관련된 속성 만 저장합니다. Customer 테이블에서도 마찬가지입니다.

3) Concrete Table Inheritance : 계층 구조에서 하나의 구체적인 클래스 당 하나의 테이블을 가진 클래스의 상속 계층 구조를 나타냅니다.

EmployeeCustomer은 모두 초록 User 클래스를 상속하며 이것을 나타 내기 위해 두 개의 테이블이 있습니다. 고객 테이블과 직원 테이블. 각 테이블은 사용자에게 공통된 정보를 저장하지만 고유 속성도 저장합니다.

+0

감사합니다. 도움이됩니다. 그래서 저는 # 2를 사용하고 있습니다. 클래스 테이블 상속에서 Employee/Customer/User에 대한 CRUD 함수를 가장 잘 구현하는 방법에 대한 의견이 있으십니까? – user456584

+1

이 게시물을 발견해 주셔서 고맙습니다! 나는 CustomerDAO 내부에 UserDAO를 감싸는 Matt의 생각을 좋아합니다. – Brandon

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); 
    } 
} 

물론 각 고객 작업은 트랜잭션으로 래핑되어 User 테이블과 Customer 테이블이 독립적으로 실패하지 않도록해야합니다.

+0

나는 코드 예제를 좋아한다. – Brandon

관련 문제