2009-03-03 5 views
5

우리는 NHibernate를 사용하고 있으며 우리가 enum-like 정보를 저장하기 위해 가지고있는 일반적인 패턴 중 하나는 열거 형을위한 별도의 테이블을 정의하고 단지 주 엔터티/열거 형을 사용하는 테이블 간단한 예 : SMS, MMS, PSMS 등Hibernate/NHibernate의 Enum 테이블

는이 같은 별도의 테이블에 열거 값을 넣어 가치가 :

Message 
------- 
ID (bigint PK) 
MessageTypeID (bigint FK) 
Body (varchar) 

MessageType 
----------- 
ID (bigint PK) 
Value (varchar) 

메세지 유형 테이블과 같은 열거 값의 작은 수를 포함? 열거 형의 프로는 미래에 더 쉽게 확장 할 수 있고 더 정규화되었지만 메시지를 가져올 때마다 조인을해야한다는 것입니다. 당신이 다른 하나를 골라 낼 지점이 있습니까?

답변

10

열거 형을 사용한다는 것은 지금하고있는 것처럼 다른 테이블을 사용하지 않는다는 것을 의미합니다. 당신이 말했고 훨씬 더 간단하면서도 빠릅니다.

두 경우 모두 옵션을 추가 할 수 있지만 질문은 : 테이블에 다른 항목을 추가하면 해당 기능을 추가하기 위해 응용 프로그램을 다시 컴파일해야합니까?

애플리케이션 디자인이 결합되어 있고 (SMS 구현을 포함해야하기 때문에) 재 컴파일해야하는 새 메시지 유형을 지원하려면 별도의 테이블을 가질 가치가 없다는 것을 의미합니다. enums

다른면에서 엔티티에 논리 (예 : 국가 또는 상태 테이블)가 없거나 응용 프로그램에서 다시 컴파일하지 않고 새 메시지 유형을 연결할 수있는 경우 다른 테이블을 사용해야합니다.

MessageType 
----------- 
ID (bigint PK) 
Value (varchar) 
ImplementationType (varchar) (ie: Xyz.SMSSender, Xyz) 

을 또는 당신은 당신이 주입 된 종속성을 사용자 정의 할 수있는 분리 된 구성 파일을 가질 수있다 :이를 위해, 당신은 이런 식으로 테이블을 변경할 수 있습니다.

2

ID가 일치하는 코드에서 MessageType 테이블에 열거 형을 만듭니다. 그런 다음 클래스에서 사용하면 nHibernate가 올바르게 매핑 할 수 있어야합니다.

특히 데이터가 관리 데이터 일 필요가없는 경우 열거 형 테이블에서 벗어났습니다. 더 많은 MessageType을 추가 할 예정입니까?