2010-02-12 3 views
2

개발 환경은 SQL Server 2008 데이터베이스 및 Entity Framework가있는 C# 3.5입니다.확장 성이 뛰어난 프로젝트의 설계 질문 - 모범 사례를 염두에두고

소프트웨어에서 제어해야하는 제 3자가 작성한 실제 전자 기호를 나타내는 Sign이라는 클래스와 테이블이 있다고 가정 해보십시오. 또한 SignDriver라는 클래스가 실제로 징후와 통신하는 것을 담당합니다. Sign의 속성/열은 신호와 올바르게 대화하기 위해 Sign Driver가 필요로하는 구성 가능한 정보를 나타냅니다.

모든 것이 훌륭하며 뒷면에서 자신을 아주 철저하게 가볍게 두드렸다. 그렇다면 다른 표식과 대화하는 것이 필요합니다. 그러나이 기호는 이전 기호와 다르게 작동하며 Sign 클래스와 테이블에 추가 정보를 저장해야합니다. 5 가지 새로운 항목 (열/속성)을 저장해야한다고 가정 해 보겠습니다. 그러나 불행히도 첫 번째 유형의 기호는이 5 가지를 필요로하지 않습니다. 그런 다음 각 유형의 부호 10 개를 제어하려고 할 때 테이블에 많은 NULL 값이 있음을 알게됩니다.

귀하의 도메인 모델은 귀하가 문제가되는 도메인의 다른 부분을 대표하고 데이터베이스의 해당 테이블이있는 Sign과 같은 클래스가 생길 때까지 커집니다. 각 학급은 유형의 공통 정보를 수집하는 것과 동일한 문제를 겪지 만 각 유형의 전문 분야는 전혀 수용하지 않습니다.

문제의 본질은 더 많은 유형의 제어 할 수있는 표지뿐만 아니라 더 많은 유형의 다른 엔티티를 수용한다는 것을 의미합니다. 좀 더 확장 가능한 모델이 필요합니다.

이와 같은 시스템에서 앞으로 나아갈 수있는 최선의 방법은 무엇입니까 ??

필자는 동료들과 마침내 이것을 논의했으며, 이와 같은 문제에 접근하는 가장 좋은 방법이 무엇인지 알고 싶습니다. 특히 그것은 많은 사람들이 과거에 직면했을 것 같은 문제처럼 보입니다.

아래는 각각에 대해 우리가 왔어요 옵션과 몇 가지 포인트입니다

  • 만들기 N와 1-1 관계를 공유하는 각 개체에 대한 '유형'클래스와 테이블의 번호입니다.
    • Very inheritance-y.
    • 연장 할 때 대부분의 시간이 소요됩니다.
    • 많은 테이블.
  • 키 - 값 쌍을 보유 할 각 엔터티에 대해 하나의 '확장 속성'테이블을 만듭니다.
    • 참조 무결성.
    • 확장 가능.
  • 하나의 글로벌 '확장 속성'테이블을 만들어 ANY 엔티티의 속성을 저장하십시오. (스키마 : entityType, entityId, key, value, dataType)
    • 슈퍼 확장 가능.
    • 기존 테이블과 참조 무결성을 가질 수 없습니다.
    • Entity Framework에서 잘 처리 할 수없는 것처럼 보입니다.

당신은 어떻게 할 건데 왜?

도움을 주시면 감사하겠습니다. 건배.

+0

와우 ... 헤드 퍼스트 디자인 패턴의 '오리'예제처럼 들립니다. 위키에는 확장 성 패턴에 대한 정보가 있습니다. http://en.wikipedia.org/wiki/Extensibility_pattern – IAbstract

+0

hehe 나는 단지 그것을 읽고 그것들은 비슷합니다, 참고를위한 감사합니다 – andrej351

답변

2

이 질문은 여러 가지 소프트웨어 디자인 문제와 관련이 있습니다.

주요 문제는 상속 계층 구조를 데이터베이스 테이블에 매핑하는 것과 같습니다. 이것은 광범위하게 분석되었습니다 - 그의 책 "Patterns of Enterprise Architecture"에서 Martin Fowler의 연구 결과를보십시오. 간략한 개요 인 here을 얻을 수 있지만이 책은 모든 OO 개발자 선반 위에 있어야합니다. "서브 클래스 당 테이블"및 "클래스 당 테이블 계층"패턴을 비교하십시오.

몇 가지 일반적인 조언 : 너무 많은 상속에주의하십시오 - 상속보다 유리한 구성. 거의 대부분 상속을 피하기 위해 리팩터링 할 수 있습니다. 기본적으로 Sign 클래스에서 분리 된 '전문화'가 끝나면 테이블 계층을 만드는 방법을 제공합니다. 앞서 언급했듯이 Head First Design Patterns 책을 시작하는 것이 좋습니다.

또한 클래스의 힙 및 테이블 힙을 두려워하지 마십시오. 일반적으로 유연한 디자인은 많은 클래스와 테이블을 선호합니다 (물론 이렇게하는 것도 단점이 있지만 최상의 타협을 결정하는 것은 사용자의 몫입니다).

관련 문제