상점 제품 엔티티, 이름, 설명, 이미지, 가격 등과 같은 많은 기능을 논리에 참여시키는 공통 기능을 가지고 있으며 시계 및 비치 볼과 같은 (반) 고유 한 기능은 완전히 다른 측면으로 설명됩니다. . 그래서 EAV가 (세미) 고유 한 기능을 저장하는 데 적합하다고 생각합니까?
EAV 구조를 사용하면 몇 가지 의미가 있습니다.
null
'보다 복잡한 쿼리 및 모델'에 대해 100 개의 열이 없기 때문에 '행을위한 공간이 부족합니다 .
EAV를 갖는 것은 일반적으로 값이 모든 데이터를 넣을 수있는 문자열임을 의미합니다. 이는 유효성 및 제약 조건 검사에 영향을 미칩니다. EAV 테이블에 사용 된 배터리 수를 넣은 상황을 고려하십시오. C 크기 배터리를 사용하지만 4 개 미만인 손전등을 찾고 싶습니다.
select P.sku
from
products P
attrib Ab on (P.sku = Ab.sku and Ab.key = "batteries")
attrib Ac on (P.sku = Ac.sku and Ac.key = "count")
where
cast(Ac.value as int) < 4
and Ab.value = 'C'
...
여기서 알아야 할 것은 값에 대해 합리적으로 색인을 사용할 수 없다는 것입니다. 또한 값 열이 다른 목적으로 반복해서 사용되기 때문에 누군가가 정수가 아닌 무언가 또는 잘못된 정수 ( '-1'배터리 사용)를 넣지 못하게 할 수 없습니다.
이는 제품의 모델을 작성하는 데 영향을 미칩니다. 당신은 좋은 유형의 가치를 가질 것입니다 ...하지만 당신은 또한 Map<String,String>
거기에 모든 종류의 것들 과 함께 앉아있을 것입니다. 이는 XML 또는 Json으로 직렬화 할 때 그리고 해당 구조 에 대해 유효성 검증 또는 조회를 수행하는 복잡성에 영향을 미칩니다 .
고려할 패턴에 대한 일부 대안 또는 수정은 올바른 키가있는 다른 테이블을 갖는 자유 형식 키 대신에 있습니다. 데이터베이스에서 문자열 비교를 수행하는 대신 외래 키 ID가 같은지 확인하는 것입니다. 키 자체 변경은 한 번에 수행됩니다. 알려진 키 세트가 있습니다. 즉, 키로 열거로 수행 할 수 있습니다.
특정 제품 클래스의 속성을 포함하는 관련 테이블이있을 수도 있습니다. 식료품 부서에는 건축 자재에 필요하지 않은 (그리고 그 반대의) 여러 속성이있는 다른 테이블이있을 수 있습니다.
+----------+ +--------+ +---------+
|Grocery | |Product | |BuildMat |
|id (fk) +--->|id (pk) |<---+id (fk) |
|expiration| |desc | |material |
|... | |img | |... |
+----------+ |price | +---------+
|... |
+--------+
특히 EAV 테이블을 요구하는 시간이 있습니다 .
모든 제품과 모든 속성을 알고있는 회사의 인벤토리 시스템을 작성하지 않는 상황을 고려하십시오. 이제 다른 회사에 판매 할 재고 시스템을 작성 중입니다. 모든 제품의 모든 속성을 알 수 는 없으며 정의해야합니다.
나오는 하나 개의 아이디어는 "우리는 고객이 테이블을 수정할 수 있습니다"이고이 (더 이상 어디에 무엇인지 없기 때문에 당신이 테이블 구조에 대한 메타 프로그래밍에 그들이 할 수있는 얻으려면, 나쁜 국왕 엉망 구조 또는 손상을 응용 프로그램, 그들은 잘못된 일을 할 수있는 액세스 권한을 가지며 해당 액세스의 의미가 중요 해집니다). MVC4 에는이 경로에 대한 추가 정보 가 있습니다. 런타임시 모델을 작성하는 방법은 무엇입니까?
대신, EAV 테이블에 대한 관리 인터페이스를 작성하고이를 사용할 수 있습니다. 고객이 'polkadots'에 대한 항목을 작성하려는 경우 EAV 테이블로 이동하여이를 처리하는 방법을 이미 알고 있습니다.
이에 대한 예는 Redmine 의 데이터베이스 모델에서 확인할 수 있습니다. custom_fields 테이블과 custom_values 테이블은 시스템을 확장 할 수있는 EAV의 일부입니다.
전체 테이블 구조가 관계형이 아닌 EAV처럼 보이는 경우 NoSQL (cassandra, redis, Mongo 등) 의 KV 특징 을보고 싶을 수 있습니다 . 이것들은 종종 당신이 그것을 사용하는 것에 적합하거나 적합하지 않을 수있는 디자인의 다른 트레이드 오프 와 함께 제공됩니다 . 그러나 이들은 EAV 구조의 의도로 특별히 설계되었습니다.
재고 관리 시스템에 대해 SQL vs NoSQL 을 읽을 수 있습니다
문서 지향 NoSQL 데이터베이스 (couch, mongo)를 사용하여이 접근 방식을 수행하면 각 인벤토리 항목을 디스크의 문서로 간주 할 수 있습니다. 단일 문서에서 모든 항목을 빠르게 가져올 수 있습니다. 또한, 문서는 하나의 것을 빠르게 뽑을 수 있도록 구성되어 있습니다. 반면에 특정 속성과 일치하는 것을 찾기 위해 모든 문서를 검색하면 성능이 떨어질 수 있습니다 (모든 파일에 대해 'grep'를 사용하는 것과 비교).
또 다른 방법은 모든 관련 항목이있는 기본을 갖는 LDAP이지만 다른 유형의 항목에 추가 객체 클래스가 적용되는 LDAP입니다. ( LDAP를 사용한 시스템 인벤토리 참조 )
이 길을 따라 가면 찾고있는 것과 정확히 일치하는 것을 찾을 수 있습니다 .