2017-05-17 8 views
1

매월 대략 1500 개의 속성이 포함 된 보고서가 약 500 만 개의 속성 보고서를 처리합니다. 범위는 smallint에서 Varchar(1000)까지입니다.속성/값 테이블에 대한 DB 효율성 향상

이러한 신용 보고서 속성은 신용 공급자마다 다릅니다. 내가 더 잘 그 아래의 스키마를 개선하는 방법에 대한 조언을 찾고 있어요

는 신용 ​​데이터를 캡처 :

credit_reports 
- id (int, PK) 
- credit_report_provider_id (int, FK) 

credit_report_attributes 
- id (int, PK) 
- credit_report_id (int) 
- attribute (varchar(10)) 
- value (varchar(1000)) 

credit_report_providers 
- id (int, PK) 
- name (varchar(15)) 

내 최고 관심사는 credit_report_attributes 테이블에 Entity-Value-Attributes 디자인의 사용이다.

여러 개의 특성이 tinyints이지만이 테이블은 모든 특성 및 값 형식/길이를 지원할만큼 충분히 포괄적이어야하므로이 테이블이 빠르게 커질수록 성능 문제가 발생할 것으로 우려됩니다.

다양한 신용 보고서 제공 업체의 신용 보고서 속성을보다 효율적으로 파악할 수있는 대체 방법이 있습니까?

+0

당신은 속성과 값에 대해 할 쿼리의 종류? –

+0

'credit_reports' 테이블에있는'hstore' 열은 EAV에 대한 매우 효율적인 대안입니다. –

+0

이것을 고려했지만 엄격하게 적용된 스키마가 부족하다는 것에 우려했습니다. 예를 들어, 제공자 X의 모든 credit_reports에 대해 소급 분석을 수행하려는 경우 모든 신용 보고서에 동일한 속성 및 값 집합이 있는지에 대한 확신이 없습니다. (응용 프로그램/코드 측에서 시행하지 않는 한) – doremi

답변

0

다른 방법으로는 속성 테이블에 속성 유형 열을 넣은 다음 작은 int 속성을 하나의 테이블로, 더 많은 문자열 기반 속성을 다른 테이블로 분리하는 방법이 있습니다. 그러나 이것은 쿼리 및 인덱싱 모델을 수행하는 방법에 따라 달라집니다. 예를 들어

:

credit_reports 
- id (int, PK) 
- credit_report_provider_id (int, FK) 

credit_report_attributes_int 
- id (int, PK) 
- credit_report_id (int) 
- attribute (varchar(10)) 
- value (tinyint) 

credit_report_attributes_string 
- id (int, PK) 
- credit_report_id (int) 
- attribute (varchar(10)) 
- value (varchar(1000)) 

credit_report_providers 
- id (int, PK) 
- name (varchar(15)) 

credit_report_providers_attributes 
- credit_report_provider_id (int, FK) 
- typeid (int, PK) 
- name (varchar(15))