2012-04-18 27 views
1

고성능 사용자 정의 사용자 필드

EAV 많은 기본 엔티티/테이블이있는

  • 같은 성능과 같은 여러 가지 이유로 문제가 될 것입니다하지 EAV를 통해 사용자 정의 사용자 필드에 대한 예/튜토리얼을 찾고 각각 100,000 개가 넘는 레코드가 있습니다
  • 12 개 이상의 속성이있을 수 있습니다.
  • 레코드는 플랫 UI 그리드에 표시되어야합니다. 사용자 정의 필드 그래서 모든 사용자 정의 필드와 같은

    <tablename>_custom_<userid> 
    

    모든 사용자 속성에 매핑 할 일치하는 테이블에 갈 것 DDL을 통해이를 가능하게 보면 성능 ​​

을 유지하면서 그들에게 문제가 될 것 평평 열 각각의 메타 데이터 테이블에 저장된 모든 메타 데이터

쿼리가 간단하게 될 경우 검색이 간단 할 것

select * 
from <tablename> A, tableName_custom_userid B 
where B.KeyField = A.KeyField --(perhaps using outer join, haven't gone that far yet) 

내가 알아야 할 길 아래에 잡았다가 있다면 궁금해하니? 물론

어떤 샘플/포인터 노력을 킥 스타트 도움이 될 것입니다

특별히 내가 사용하는 본의 SQL Server Compact 4

+1

EAV가 성능 때문에 왜 자동으로 문제가 될 것이라고 생각하십니까? http://sqlblog.com/blogs/aaron_bertrand/archive/2009/11/19/what-is-so-bad-about-eav-anyway.aspx http://sqlblog.com/blogs/merrill_aldrich/archive/2009 /11/20/wrinkly-entropy.aspx –

+0

위에서 언급 한 바와 같이 플랫 디스플레이는 큰 요구 사항이며 블로그 링크와 같이 "고객의 일련의 속성 값을 한 행에 모두 반환하는 것은 쉽지 않습니다." – Kumar

+1

"사소하지 않음 "은 반드시"느리게 "는 것을 의미하지 않습니다. –

답변

1

하나의 기술에 대한 DDL을 사용하는 방법에 대한 조언을 부탁드립니다 것은 일종의을 사용하는 것입니다 '하드 코딩 된'EAV 패턴. 끊지 마! 그것은 당신이 이야기하고 실제로 EAV를 사용하지 않은 데이터 세트 크기로 잘 작동했습니다 - 그것은 EAV-esque뿐이었습니다.

아이디어는 이러한 사용자 정의 속성을 아래에 설명 된 일부 트리거와 함께 저장하는 테이블 세트를 갖는 것입니다. 사용자 지정 특성 테이블 세트는 특성 (어떤 테이블과 함께 사용되는지, 데이터 형식, 제약 조건 등)에 대한 메타 데이터를 저장합니다. 당신은 이것에 아주 공상을 얻을 수있다 그러나 나는 필요를 haev이지 않았다.

메타 테이블의 트리거를 사용하면 기본 + 확장자를 DB 내의 첫 번째 클래스 개체로 롤업하는보기가 다시 생성됩니다. 따라서 테이블 person + employee 확장 테이블 대신에 두 가지를 모두 포함하는 employee 뷰가 있습니다. 새 값을 사용자 지정 특성 테이블에 놓으면 트리거가 뷰를 다시 롤링하고 새 내용을 포함합니다. 견본을 원한다면 트리거가 저장 프로 시저를 다시 작성할 수도 있습니다. 중간 계층 코드의 구조에 따라 일부 코드를 다시 코딩해야하지만이 경우 데이터를 읽는 규칙을 적용해야합니다.

테스트에서 필자는 비교적 적은 수의 레코드에 대해 성능이 다소 느리지 만 거의 동일한 패턴의 저하 (레코드 수의 2 배, 느린 속도의 2 배)를 따랐습니다.

- 편집 -

나는 그것이 첫 번째 클래스 개체를 나타내는 표, '사람'과 대한 행 '직원'등 우리는거야에 대한 그래서 행을 가지고 수행 보았다 어떻게

FCO에 전화 해. 그런 다음 FCO를 나타내는 테이블을 저장 한 보조 테이블이 있습니다. 그 사람을 Srcs라고 부를 것입니다. 사람에게는 한 행, 사람 테이블이 있습니다. Employee에는 person 테이블과 Employee 확장이라는 두 행이 있습니다.Attribs라는 세 번째 테이블은 FCO를 구성하는 테이블의 열을 저장합니다. 간단히 말하면, Employee는 ID, Name, Address를 가지고 있고, Employee는 Employee와 Department를 가지고 있으며 Person 테이블은 Person 테이블을 참조하고 있음을 알 수 있습니다. 따라서 FCO 테이블 (사람과 직원)의 2 행, Src 테이블의 3 행, Attribs의 8 행.

보기에서는 vw_Employee라고하고 두 테이블에서 PersonID, 이름, 주소, 고용 날짜, 부서를 선택합니다. OnMetadataChange라고 부르는 SQL 저장 프로 시저에 의해 만들어졌습니다.

이 SP는 트리거 또는 배치 프로세스에 의해 실행되며 CREATE VIEW 문을 생성하는 것이 목적입니다. 모든 퍼스트 클래스 객체를 반복하고 뷰를 구성하는 테이블의 필드를 수집하며이를 기반으로 CREATE 문을 발행합니다. OnMetadataChange는 각 뷰에 대해 DROP 및 CREATE를 생성하므로 FCO 테이블의 항목마다 한 번 실행되는 동적 SQL 문을 생성합니다. 이 작업은 트리거로 수행하는 것이 좋지만 반드시 필요한 것은 아닙니다. 다행히도 FCO 정의가 너무 자주 변경되지는 않을 것이며, 그렇게되면 코드 배포가있을 것입니다. 이 때 OnMetadataChange SP를 실행할 수 있습니다.

최종 결과는 2 계층 데이터베이스입니다. 뷰는 응용 프로그램에 의미있는 First Class Object 레이어를 구성합니다. 응용 프로그램은보기 만 사용합니다. 테이블은 응용 프로그램이 신경 쓰지 않아야하는 '물리적'계층을 구성합니다. 메타 테이블은 본질적으로 FCO 계층과 실제 계층 사이의 매핑입니다. 설정하는 데는 시간이 걸리지 만 EAV의 많은 이점을 제공하는 동시에 3nf 테이블 (인덱서 빌리티 등)의 구체적인 이점을 제공하므로 매우 효과적입니다.

원한다면 거기에 몇 가지 샘플 SQL을 던질 수 있습니다.

+0

흥미로운 아이디어, 더 자세한 내용은 비교 환상적 일 것입니다! 이상적으로는 DB 유형에 따라 일관성을 유지하고 싶습니다. SQL Server에 대한 응답은 없습니다. – Kumar

+0

흠, 트리거하지 않으면 메타 테이블의 변경 사항을 감지하는 다른 방법이 필요합니다. 일괄 처리로 처리 할 수 ​​있습니다. 어떻게 완료했는지, 첫 번째 클래스 개체를 나타내는 테이블이 있었기 때문에 '사람'행과 '직원'행이 있습니다. –

+0

흠, 나는 분명히 이것에 대해 새것입니다. 위의 편집을 올립니다. –

0

SQL 데이터베이스에 스키마가없는 데이터를 저장하려고한다는 것이 문제의 일부입니다. SQL 데이터베이스는 그 힘이 아닙니다. 당신의 삶을 훨씬 쉽게 만들어 줄 수있는 3 가지 방법이 있습니다 :

1) 직렬화 된 사용자 정의 필드를 저장하는 컬럼을 mst 형 식으로 사용하십시오. 예를 들어,이 열은 xml을 저장할 수 있습니다. 장점은 SQL Server Compact를 사용할 수 있고 레코드를 가져 오는 것이 쉽다는 점입니다. 단점은 업데이트를 수행하기 위해 항상 전체 XML BLOB를 가져 오거나 푸시해야하므로 모든 사용자 정의 필드를 쿼리하는 것은 거의 불가능하다는 것입니다.

2) SQL Server Express로 업그레이드하고 XML 열을 사용하십시오. 이는 SQL Server의 서버 준비 버전이 XML 데이터에 대한 기본 지원을한다는 점을 제외하고는 첫 번째 제안과 거의 같습니다. 이러한 열은 인덱스를 추가 할 수 있으며 데이터 내의 필드는 쿼리에 사용할 수 있습니다.

3) MongoDB 또는 CouchDB와 같은 스키마없는 데이터베이스를 사용하십시오. 이 데이터베이스는 모두 스키마없는 데이터를 저장하기 때문에 사용자 정의 필드는 다른 필드와 다를 바 없습니다. 따라서 사용자 지정 필드를 인덱싱하고 쿼리 할 수 ​​있습니다. 사용자 정의 데이터는 믿을 수 없을만큼 쉽게 작업 할 수 있다는 측면에서 부작용이 있습니다. 단점이라면 데이터를 모델에 맞게 저장하는 방법을 다시 생각해보아야한다는 것입니다.

사용자 지정 필드를 기반으로 쿼리 할 필요가 없거나 비즈니스 논리에서 사용자 지정 필드를 쿼리 할 수있는 경우 첫 번째 옵션을 사용할 수 있습니다. 다른 경우에는 컴팩트보다 더 많은 기능을 갖춘 것으로 잘못 인도 할 것입니다. 비용이 결정적인 요소라면 SQL Server Express와 MongoDB는 모두 무료입니다.

+0

이전에 nosql을 보았고 여기에 기본 모델을 약속하면서도 여전히 관계형입니다! sql compact는 SQL Express에 비해 설치 공간이 적습니다. 새 sql localdb는 유망하지만이 단계에서 변경하기에는 너무 늦었습니다. – Kumar