2009-12-22 4 views
4

NHibernate와 Fluent NHibernate를 사용하여 확장 가능한 데이터 모델로 전자 상거래 애플리케이션을 구축 할 생각입니다. 확장 가능한 데이터 모델을 보유함으로써 제품 엔터티를 정의하고 응용 프로그램의 사용자가 사용자 지정 데이터 형식을 포함하여 다른 데이터 형식의 새 필드/속성으로 확장 할 수 있도록했습니다.어떻게 확장 데이터 모델을 구축합니까

예 : 제품과 같은 추가 필드를 가질 수 있습니다 크기 - 색상 값 int - 문자열을 가격 - 소수점 ColoredImage의 컬렉션 - 이름, 이미지 (예 : "레드", red.jpg (이진 파일))

이러한 추가/확장 필드를 사용하여 제품을 필터링 할 수있는 추가 요구 사항이 있습니다. 어떻게 구현해야합니까? 사전에

감사합니다.

+0

확장 성이 있다고 할 때 확장 성을 말합니까? –

답변

0

가능한 모든 옵션은 XML 구조에 모든 추가 필드를 저장하고 XPath/XQuery를 사용하여 데이터베이스에서 검색 할 수 있습니다. 응용 프로그램의 각 확장 가능 엔터티에는 모든 추가 속성을 포함하는 ExtendedData와 같은 XML 필드가 있습니다.

+0

NHibernate를 사용하여 데이터를 쿼리해야합니다. 지금까지 xml 열의 필터를 사용하여 nh 쿼리를 작성하는 것에 대해서는 전혀 모른다. – Tim

1

나는 ...이 링크는 당신이 원하는 종류를 설명 생각

http://ayende.com/Blog/archive/2009/04/11/nhibernate-mapping-ltdynamic-componentgt.aspx

동적 구성 요소에

더 많은 정보 :

http://www.mattfreeman.co.uk/2009/01/nhibernate-mapping-with-dynamic-component/ http://bartreyserhove.blogspot.com/2008/02/dynamic-domain-mode-using-nhibernate.html

동적 요소 뒤에 아이디어 특성을 가진 databse 열의 일대일 매핑이 없어도 데이터 모델을 구축 할 수 있다는 것입니다. 대신 원하는 많은 속성의 데이터를 포함 할 수있는 사전 속성 만 있습니다. 이 방법으로 엔티티를 가져 오면 사전은 거기에 속하도록 구성된 모든 열의 데이터를 가져옵니다. 데이터베이스 테이블의 스키마를 확장하여 더 많은 열을 포함 할 수 있으며 그에 따라 매핑 파일을 수동으로 또는 응용 프로그램 시작시 코드를 사용하여 업데이트하면 데이터베이스 모델에 반영됩니다.

솔직하게 "속성"속성을 사용하여 이러한 엔터티를 쿼리 할 수 ​​있는지는 모르겠지만 IN 문을 사용한다고 추측해야합니다.

+0

그래, 그 링크는 확장 속성을 매핑하는 방법에 대해 설명합니다. 그러나 확장 가능한 데이터 모델을 구축하는 방법에 대한 아이디어는 더 이상 제공하지 않습니다. – Tim

+0

다음은 확장 가능한 데이터 모델을 구현하는 방법에 대한 저의 생각입니다. ProductExtendedProperty { 문자열 키 개체 값 } ProductExtendedPropertyCollection { 은 IList productExtendedProperties } 제품 내 주요 문제입니다 { 이 ProductExtendedPropertyCollection의 ExtendedProperties} : 내가 데이터베이스를 어떻게 설계 할 모델? 어떻게이 매핑을 만들 수 있습니까? NH을 사용하여 어떻게 쿼리합니까? 값을 XML 열/XML로 저장합니까? "값"을 검색 가능하게 만들려면 어떻게해야합니까? – Tim

+0

더 많은 정보를 포함하도록 답변을 업데이트했습니다. 그 순간 나는 동적 인 구성 요소로 더 많은 세부 사항을 알기 위해 아직 일하지 않았기 때문에 내가 가진 모든 것입니다. – tolism7

1

옵션 중 하나는 EAV 모델 (Entity-Attribute-Value)입니다.

이 모델은 당신이 테이블 표현이 넓은 테이블 초래 도메인에 하나의 클래스 (열 많은, 많은 null 값)

그것은 원래 의료 도메인에 대한 설계가있는 경우에 적용하는 것이 좋다, 여기서 객체는 수천 개의 열 (sympthoms)을 가질 수 있습니다.

은 기본적으로 당신은 당신은 몇 가지 추가 메타 데이터 테이블을 가질 수

엔티티 (ID) (예를 들어 귀하의 제품 테이블) 특성 (ID,의 ColumnName) 값 (ENTITYID,의 AttributeId, 값)이있다.

값은 유형에 대해 하나가 아닌 여러 개의 테이블이어야합니다. 예 : ShortStringValue (EntityId, AttributeId, Value nvarchar (50)); LongStringValue (EntityId, AttributeId, 값 nvarchar (2048)); MemoValue (EntityId, AttributeId, Value nvarchar (max)); IntValue (EntityId, AttributeId, Value int);

심지어는 완료 유형 : ColorComponentsValue (EntityId, AttributeId, R int, G int, B int);

내 경험에 따르면, EAV를 모든 용도로 사용해서는 안된다는 것입니다. 단일 클래스 인 EAV를 예로 들자. 다른 기본 클래스에 확장 성을 사용해야하는 경우 별도의 EAV 테이블 집합으로 둡니다.

그 외에도 객체에 대한 스마트 구현 전략을 고안해야합니다. 이 값을 넓은 행 집합으로 피벗하지 않고 쿼리 조건에 필요한 수의 collumn 만 피벗 한 다음 선택한 각 개체에 대해 좁은 값 행 컬렉션을 반환합니다. 그렇지 않으면 피봇 팅은 대량 조인과 관련됩니다.

고려해야 할 몇 가지 점이 있습니다 : . 각 값에는 외래 키 의 저장 공간이 필요합니다. 예를 들어 행 수준 잠금은 이러한 쿼리에 대해 서로 다르게 동작하므로 성능이 저하 될 수 있습니다. . 색인 크기가 커질 수 있습니다.

실제로 얕은 헬로우 월드 테스트에서 EAV 솔루션은 조건에 관련된 4 개의 열이 포함 된 쿼리에서 20 열 테이블의 정적 카운터 파트보다 성능이 우수했습니다.

0

또 다른 옵션은 일반적으로 이러한 종류의 작업에 적합한 비 관계형 데이터베이스를 사용하는 것입니다.

NOSQL 데이터베이스 (couchDB, mongoDB, cassandre ...)를 사용하면 고유 필드를 동적으로 정의 할 수 있으므로 원할 때마다 필드를 제품 클래스에 추가 할 수 있습니다.

0

나는 비슷한 것을 찾고 있는데, 꽤 유용한 방법으로 도메인 확장 성을 구현하는 N2 CMS (http://n2cms.com)를 찾았습니다. 중요한 확장 필드를 통한 쿼리도 지원합니다. 내가 알아 낸 유일한 단점은 HQL을 사용하여 구현되었으므로 QueryOver/Linq를 사용하여 쿼리 할 수 ​​있도록 재 구현하는 데 시간이 좀 걸릴 것이지만 주요 아이디어와 매핑이 있다는 것입니다. ContentItem, DetailCollection, ContentDetail 클래스, 해당 매핑 및 QueryBuilder/DetailCriteria에 대해 살펴보십시오.

관련 문제