2009-04-04 5 views
30

"파티 모델"은 관계형 데이터베이스 디자인을위한 "패턴"입니다. 그것의 적어도 일부는 고객, 직원, 파트너 등과 같은 많은 엔티티 사이의 공통성을 찾아 내고 그것을 좀 더 추상적 인 데이터베이스 테이블에 포함시키는 것을 포함합니다."정당 모델"의 기본 원리와 이점은 무엇입니까?

나는 다음에 당신의 생각을 찾으려면 :

  1. 파티 모델 뒤에 핵심 원칙과 동기 부여의 힘은 무엇인가?
  2. 데이터 모델에 대한 처방은 무엇입니까? (위의 비트는 꽤 높은 수준이며 어떤면에서는 상당히 잘못된 것 같습니다. 저는이 프로젝트를 사용하고 있었지만 다른 문제에 초점을 맞춘 별도의 팀과 함께 작업하고있었습니다).
  3. 당신의 경험으로 인해 어떤 느낌이 들게 되었습니까? 그것을 사용 했습니까? 그렇다면 다시 사용합니까? 장단점은 무엇 이었습니까?
  4. 파티 모델이 원하는 ORM을 제한 했습니까? 예를 들어 도메인 객체와 실제 데이터 모델간에 "추상화 계층"이 충분하지 않기 때문에 특정 ORM을 제거해야합니까?

나는 모든 질문에 답변하지 않을 것이라고 확신하지만, 그 중 하나 이상을 만지는 것은 내가 직면하고있는 결정을 내리는 데 도움이 될 것입니다.

감사합니다.

답변

21
  1. 파티 모델 뒤의 핵심 원칙과 동기 부여의 힘은 무엇인가?

필자가 사용한만큼 코드 재사용과 유연성에 관한 내용입니다. 이전에 guest/user/admin 모델에서 사용 해왔고 사용자를 한 그룹에서 다른 그룹으로 이동해야 할 때 그 가치를 입증합니다. 이를 사용자 아래에있는 조직 및 회사 에까지 확장하고 실제로 SQL에 고유하지 않은 추상화 형태를 제공합니다.

  1. 데이터 모델에 대한 처방은 무엇입니까? (위의 내 비트 꽤 높은 수준과 어떤면에서 아마도 잘못이다. 나는 그것을 사용하는 프로젝트에 있었어요,하지만 난했다 별도의 팀과 함께 작업하는 것은 다른 문제에 집중).

좀 더 자세히 설명해도 위와 똑같습니다. 데이터베이스의 엔티티 (파티라고 부름)가 다른 당사자와 계약을 맺는 상황을 상상해 볼 수 있습니다. 그러면 상황에 따라 하청을받을 수 있습니다. 당사자는 직원, 계약자 또는 회사, 모든 당사자의 당사자 일 수 있습니다. 내 이해에서, 당신은 Party 테이블과 각 서브 클래스에 대한 더 구체적인 테이블을 가지게 될 것이고, 그런 다음 더 하위 클래스 화 될 수 있습니다 (Party -> Person -> Contractor).

  1. 당신의 경험으로 인해 어떤 느낌이 들게 되었습니까? 그것을 사용 했습니까? 이면 그렇게할까요? 찬반 양론은 이었습니까?당신이 당신의 시스템에 새로운 유형을 추가하고 새로운 수준으로 이동 (사용자의 시작과 건축가에 기대하지 않았다 유형 간의 관계를 만들기 위해 유연해야하는 경우

그것은 그 혜택을 가지고, 회사는 고용 다른 회사 등). 또한 단일 쿼리를 실행하고 여러 유형의 당사자 (회사, 직원, 계약자)에 대한 데이터를 검색하는 이점을 제공합니다. 플립 측면에서, 당신은 실제로 필요로하는 데이터를 얻기 위해 추상화 계층을 추가하고 특정 유형을 쿼리 할 때 데이터베이스에서로드 (또는 적어도 조인의 수)를 늘리고 있습니다. 추상화가 너무 많이 진행된다면 복잡한 쿼리가 가독성과 데이터베이스 부하에 해로울 수 있으므로 데이터를 검색하기 위해 여러 쿼리를 실행해야 할 수 있습니다.

  1. 파티 모델에서 ORM을 선택하지 않았습니까? 예를 들어, 도메인 개체와 실제 데이터 모델 사이에 "추상화 계층"이개로 충분하지 않았기 때문에 특정 ORM을 제거해야합니까?

이 내가 틀림에 조금 약한 해요 영역입니다,하지만 난 응용 계층에서의 전망과 미러 추상화를 사용하는 것은 문제의이 너무 많이하지 않았 것으로 나타났습니다. 데이터 소스를 직접 읽으 려 할 때 (항상 새로운 개발자가 시스템에 대해 직관적 인 것은 아니지만) 필자의 실제 문제는 언제나 "데이터 X의 일부가 어디에 있는지"였습니다.

+0

환상적인 응답. 감사. "앱 레이어에서 추상화 된 미러링"이라고 말하면 도메인 객체도 파티 모델 패턴을 따랐다는 의미입니까? –

+0

그렇습니다. 이는 분명히 동기화 문제가 발생하는 논리를 2 곳에서 작성해야한다는 것을 의미합니다. 그러나 제 3 자 ORM 사용 범위는 매우 제한적입니다 (사내 ORM 도구를 자주 사용했지만) –

0

확실하지 않지만 파티 모델은 일반화 전문화 패턴의 특별한 경우처럼 들립니다. "일반화 전문화 관계형 모델링"에 대한 검색은 흥미로운 기사를 찾습니다.

1

이것은 방대한 주제이므로 Len Silverston과 Paul Agnew가 The Data Model Resource Book Volume 3 - Universal Patterns for Data Modeling을 읽는 것이 좋습니다.

방금 ​​사본을 받았으며 매우 좋습니다 - 하이브리드 상황 별 역할 패턴 등을 포함하여 데이터 모델링에 대한 다양한 접근 방식에 대한 간과를 제공합니다. 그것은 모든 접근법에 대해 상세한 PRO와 CON을 가지고 있습니다.

파티 관계와 역할을 모두 장점과 단점으로 모델링 할 수있는 방법이 있습니다. 응답으로 받아 들여진 질문은 '당 모델 (party model)'의 한 사례를 다룹니다.

예를 들어 "Employee", "Project Manager"등과 같은 개념은 당사자가 특정 컨텍스트 내에서 재생할 수있는 역할입니다. 집에 가면 더 나은 고장을 줄려고 노력할 것입니다.

2

저는 1980 년대 초에 이러한 아이디어를 구현 한 팀의 일원 이었지만 아직 발명되지 않았기 때문에 ORM의 선택을 제한하지 않았습니다.

나는 그 아이디어가 언제나 "혁명적 인"아이디어를 보아온 가장 확실한 개념 증명 중 하나 였기 때문에 언제든지 그 생각을 되풀이 할 수 있습니다.

아무 것도 강요하지 않습니다. 그리고 그것은 당신을 어떤 실수로부터도 막지는 못합니다. 자신의 정보 모델을 정의하는 것은 당신입니다.

모든 당사자는 공통된 많은 속성을 가지고 있습니다. 그들이 이름과 같은 것을 가지고 있다는 사실 (우리는 그것들을 "신상학"이라고 불렀습니다).주된/주 위치가 "주소"라고 불리는 사실. 그들 모두가 어떤 의미에서 사업 계약에 관련되어 있다는 사실.

5

파티 모델 (엔티티 스키마라고도 함)의 개념은 스키마없는 데이터베이스의 확장 성 이점 중 일부를 활용하는 데이터베이스를 정의하는 것입니다. 파티 모델은 엔티티를 파티 형식 레코드로 정의하여 엔티티 당 하나의 테이블을 정의합니다. 결과적으로 매우 적은 수의 테이블과 저장하는 데이터의 의미 론적 의미에 대한 지식이 거의없는 매우 정규화 된 데이터베이스입니다. 모든 지식은 코드에서 데이터 액세스로 푸시됩니다. 파티 모델을 사용하는 데이터베이스 업그레이드는 스키마가 변경되지 않으므로 아무 것도 최소화하지 않습니다. 이것은 본질적으로 멋진 이름과 몇 가지 추가 속성이있는 영광스러운 키 - 값 쌍 데이터 모델 구조입니다.

장점 :

  • 킥 - 엉덩이를 수평 확장 성을 제공합니다. 엔티티 모델에서 5-6 개의 테이블을 정의한 후에는 해변에 가서 마가리타를 마실 수 있습니다. 최소한의 노력으로 원하는만큼이 데이터베이스를 사실상 확장 할 수 있습니다.
  • 데이터베이스는 사용자가 던지는 모든 데이터 구조를 지원합니다. 또한 응용 프로그램에 영향을주지 않고 즉시 데이터 구조와 파티/엔티티 정의를 변경할 수 있습니다. 이것은 매우 강력합니다.
  • 스키마를 변경하지 않고 레코드를 추가하여 임의의 데이터 엔터티를 모델링 할 수 있습니다. 스키마 이주 스크립트에 작별 인사 할 수 있습니다.
  • 이것은 프로그래머가 천국이기 때문에 작성한 코드가 코드에서 사용하는 실제 엔티티를 정의하고 객체에서 테이블로 또는 그와 같은 매핑이 없으므로 프로그래머의 천국입니다. 당신은 선택의 프레임 워크 (.NET 용으로 System.Object)

단점의 기본 객체로 파티 테이블 생각할 수 :

  • 파티/엔티티 모델으로 ORMs 잘 연주, 그래서 잊지 못할 EF 나 NHibernate를 사용하여 의미 론적으로 의미가있는 엔티티를 엔티티 데이터베이스에서 가져 오는 방법.
  • 많은 조인. 성능 조정 문제. 이 '단점'은 엔티티를 정의하는 데 사용하는 관행과 관련이 있지만, 야간에 악몽을 불러 일으킬 수있는 마음이 구부러지는 쿼리를 훨씬 더 많이 수행하게 될 것이라고 말하기는 쉽습니다.
  • 더 힘들어. 비즈니스에 익숙하지 않은 개발자 및 DB 전문가는 이러한 모델에 노출 된 엔티티에 익숙해지기가 더 어려워집니다. 모든 것이 추상적이기 때문에 다이어그램이나 시각화를 데이터베이스 상단에 구축하여 다른 사람에게 저장된 내용을 설명 할 수는 없습니다.
  • 무거운 데이터 액세스 모델 또는 비즈니스 규칙 엔진이 필요합니다. 기본적으로 어떤 시점에서 데이터베이스에서 원하는 것이 무엇인지 이해하는 작업을 수행해야하며 데이터베이스 모델은 이번에는 도움이되지 않습니다.

관계형 데이터베이스에서 파티 또는 엔터티 스키마를 고려하고 있다면 NoSql 데이터 저장소, BigTable 또는 KV Stores와 같은 다른 솔루션을 고려해야합니다. 이 운동을 개척 한 MongoDB, DynamoDB, Cassandra와 같은 대규모 배포 및 견인 기능이있는 훌륭한 제품이 몇 가지 있습니다.

0

내 이해에서 간단한 이야기로 : 파티 모델링은 유연성을 제공하고 T-SQL 조인과 같은 더 많은 노력이 필요합니다.
"파티 모델링 (직렬화/일반화)을 사용하면 FK-Relation을 다른 테이블에 추가 할 수 있습니다." 예를 들면 : 사용자 (관리자, 사용자, 다른 유형의 생각 ...) User 테이블로 일반화했으며 테이블에 UserID을 가질 수 있습니다.

관련 문제