0

특정 개체 (즉, 제품)의 테이블 하나와 동적 특성 테이블 한 개를 포함하는 모델로부터 쿼리하는 데 도움이 필요합니다. SQL Server 2012의 엔터티 특성 값 모델 ("동적 특성") 쿼리에 대한 지원

은 이제 나는 그런 Price, Color, Weight하고 또한 Engine, Gears, Color 같은 속성을 가진 Car 같은 속성을 가진 Chocolate를 저장할 수 있다는 가정 해 봅시다. 나는 클라이언트 목록에서 얻을

Id (int)    -- of the attribute 
ProductId (int)  -- of the specific product 
AttributeType (int) -- enum with the following values ("Color", "Price","Height", "Width"....) 
StringValue -- of the product 
IntValue -- of the product 
DoubleValue -- of the product 
BooleanValue -- of the product 

:

Id (Int), 
Name (NVarchar) 

내가 다른 테이블은 다음 열 dynamicAttributes를 불렀다 : 내 예에서

나는 다음과 같은 열이있는 제품이라는 테이블이 속성 코드와 그 값의 목록.

각 속성에 대해 값 유형 (일명 부울, 문자열, int)을 얻을 수 있습니다.

내 응용 프로그램에서이 모델을 쿼리하는 가장 좋은 옵션은 무엇입니까?

동적 sqls 만? 피벗 키워드 사용?

+1

이 디자인 안티 패턴의 이름 is "엔티티 att ribute 값 ". 그것을 검색하십시오. 거기 이것에 관한 수많은 게시물이 있습니다. –

+1

정말 대단히 나쁜 생각입니다. EAV를 피하려고 노력해야합니다. 처음에는 영리한 선택처럼 보이지만, 시간이 지남에 따라 거대한 성능과 유지 보수의 악몽이됩니다. 비효율적이고 지저분한 쿼리는 말할 것도 없습니다 모든 데이터를 가져올 수 있습니다. .... **하지 마!** –

+1

[파괴의 EAV 피하기 (Joe Celko 저)] (http://www.simple-talk.com/sql/t-sql-programming/avoiding-the-eav-of-destruction/), [ 5 가지 간단한 데이터베이스 설계 오류 (피할 수 있어야 함) (포인트 3)] (http://www.simple-talk.com/sql/database-administration/five-simple--database-design-errors-you-should-avoid/), 그리고 [Bad CarMa] (http://www.simple-talk.com/content/article.aspx?article=292)를 방대한 EAV 오류의 극한의 예로 들었다. –

답변

0

많은 사람들이 지적했듯이 많은 PIVOT 쿼리를 수행하는 것은 꽤 비효율적이며 PIVOT을 사용하는 SQL 쿼리를 작성하고 디버깅하는 것은 힘들다.

대안으로 데이터베이스에서 데이터를 저장된 방식으로 다시 가져 오는 것입니다 (예 : 여러 행). 그런 다음 데이터베이스 액세스 레이어에 코드를 작성하여 행을 단일 객체 인스턴스로 마사지하고 데이터베이스 행당 객체에 하나의 속성을 추가하십시오. 이것은 마틴 파울러 (Martin Fowler)의 훌륭한 책 "엔터프라이즈 애플리케이션 아키텍처 패턴 (Patterns of Enterprise Application Architecture)"에서 Table Module pattern이라고 불립니다.

재사용 가능한 방식으로 DBAL 코드를 작성하는 경우 EAI 테이블에 저장된 객체를 읽고 저장하는 데 응용 프로그램의 후속 코드를 매우 쉽게 만들 수 있습니다.

하지만 다른 의견 작성자는 동의합니다. I'm generally against using the EAV design. EAV가 데이터베이스 규칙을 어기는 방법을 보완하는 코드를 작성하는 데 많은 작업이 필요합니다. 나는 네가 네 일과 더 잘 할 것 같아! 대안

은 다음을 참조하십시오