복붙노트

[SQL] 엄격한 관계 모델 전자 상거래 대 법인 속성 값 데이터베이스

SQL

엄격한 관계 모델 전자 상거래 대 법인 속성 값 데이터베이스

EAV / CR 데이터베이스 모델이 나쁘다는 말을하는 것이 안전합니다. 즉, 말했다

질문 : 데이터베이스 모델, 기술, 또는 패턴이 런타임에 변경 될 수 있습니다 전자 상거래 제품을 설명하는 속성의 "클래스"를 처리하는 데 사용되어야 하는가?

좋은 전자 상거래 데이터베이스에서, 당신은 (각 TV의 해상도가 TV의 해상도와 같은, 그러나 다음 제품이되지 않을 수있는 TV를하지 "TV 해상도"가) 옵션의 클래스를 저장합니다. 변수 필드가 제품을 설명과 함께 설치 제품 유형에 사용자를 어떻게, 저장할 않습니다 효율적으로 검색하고, 허용? 고객은 일반적으로 콘솔 깊이에 따라 TV를 검색하는 검색 엔진 발견, 당신은 당신의 분야에 콘솔 깊이를 추가 할 수 있다면, 실행시에 각 TV 제품의 유형에 대한 하나의 깊이를 추가 할 수 있습니다.

그들은 제품의 집합을 보여 좋은 전자 상거래 응용 프로그램들 사이에서 좋은의 일반적인 기능은 다음이 당신이 헤더로 "TV 해상도"를 볼 수있는 사이드 메뉴와의 상위 5 가장 일반적인 TV 해상도를 "드릴 다운"이 발견 세트. 당신은 한 번의 클릭으로 사이드 메뉴에 다른 카테고리를 선택하여 추가로 드릴 다운 당신을 수 있도록 해당 해상도의 그것은 단지 쇼 TV를. 이 옵션은 동적 제품이 실행 시간에 추가 속성이 될 것입니다.

심도 깊은 논의:

그래서 긴 이야기를 짧게, "학문적"다음 설치를 해결할 수있는 인터넷 모델 설명에 밖으로 어떤 링크가 있습니다? 나는 카테고리 테이블을 제안하기위한 노엘 케네디 감사하지만, 필요보다 더 클 수있다. 나는 중요성을 강조하기 위해 노력하고, 그것을 아래에 다른 방법을 설명합니다. 나는 문제를 해결하기 위해 관점 보정을해야하거나 내가 EAV / CR로에서 더 깊게해야 할 수도 있습니다.

EAV / CR 모델에 긍정적 인 반응을 사랑 해요. 내 동료 개발자 제프리 켐프가 아래에 감동 무엇을 모든 말은 "새 엔티티 모델링 및 전문가에 의해 설계되어야합니다"(문맥 촬영, 아래 자신의 응답을 읽기). 문제는:

고객은 두 가지 이유로 제품에 속성을 추가하려고합니다 :

속성은 의미가 아니라 키워드 검색을해야합니다. 그들은 "설탕 장식 크림"이 모든 케이크를 비교할 경우, 그들은 그들은 모두 크림 설탕을 채찍질 한 알 흥미로운 모든 케이크를 확인, 설탕 장식 크림을 클릭, 케이크를 클릭 생일 테마를 클릭 할 수 있습니다. 이 케이크에 특정 단지 예 아니다.

해결법

  1. ==============================

    1.내가 하나가 다른 것보다 더 나은 경우가 생각할 수있는 몇 가지 일반적인 장점과 단점이있다 :

    내가 하나가 다른 것보다 더 나은 경우가 생각할 수있는 몇 가지 일반적인 장점과 단점이있다 :

    옵션 1, EAV 모델 :

    별도로 각 엔티티 모델링 옵션 2 :

    옵션 3, 조합 ( "제대로"모델 개체,하지만 일부에 대한 사용자 정의 속성에 대해 "확장"을 추가 / 모든 엔티티)

    * 난하지 않도록 옵션 3가 반드시 설계 단계에서 어떤 시간을 절약 할 수있는 경우.

    필자는 개인적으로 옵션 2를 향해 의지, 그리고 가능하면 EAV을 피할 것. 그러나 일부 시나리오 사용자는 EAV와 함께 제공되는 유연성을 필요로; 그러나 이것은 큰 비용으로 제공됩니다.

  2. ==============================

    2.아니, 아니에요. 그것은 그들이 관계형 데이터베이스의 비효율적 인 사용에있어 단지입니다. 순전히 키 / 값 저장소는이 모델과 함께 잘 작동합니다.

    아니, 아니에요. 그것은 그들이 관계형 데이터베이스의 비효율적 인 사용에있어 단지입니다. 순전히 키 / 값 저장소는이 모델과 함께 잘 작동합니다.

    지금, 당신의 진짜 문제에 어떻게 다양한 속성을 저장하고 검색 가능한 유지?

    그냥 EAV를 사용합니다. 귀하의 경우는 하나의 별도의 테이블이 될 것입니다. 두 속성 이름과 값 인덱스는 대부분의 RDBMS 정말 빠르고 콤팩트를 만드는 속성 이름의 반복에에 접두사 압축을 사용합니다.

    당신은 '진짜'필드를 대체하는 데 사용할 때 EAV / CR 못생긴 가져옵니다. 모든 도구와 마찬가지로, 그것을 남용하는 것은 '나쁜'이며, 그것은에게 나쁜 이미지를 제공합니다.

  3. ==============================

    3.

    // At this point, I'd like to take a moment to speak to you about the Magento/Adobe PSD format.
    // Magento/PSD is not a good ecommerce platform/format. Magento/PSD is not even a bad ecommerce platform/format. Calling it such would be an
    // insult to other bad ecommerce platform/formats, such as Zencart or OsCommerce. No, Magento/PSD is an abysmal ecommerce platform/format. Having
    // worked on this code for several weeks now, my hate for Magento/PSD has grown to a raging fire
    // that burns with the fierce passion of a million suns.
    

    http://code.google.com/p/xee/source/browse/trunk/XeePhotoshopLoader.m?spec=svn28&r=11#107

    누군가가 봉인, 머뭇 거리는 게임에 스키마를 넣어 그와 페인트 shacker에 넣어처럼 내부 모델은 최고의 엉뚱한입니다 ...

    현실 세계 : 나는 midware 이행 응용 프로그램에서 일하고 있어요 여기에 주소 정보를 얻을 수있는 쿼리가 하나에게 있습니다.

    CREATE OR REPLACE VIEW sales_flat_addresses AS
    SELECT sales_order_entity.parent_id AS order_id, 
           sales_order_entity.entity_id, 
           CONCAT(CONCAT(UCASE(MID(sales_order_entity_varchar.value,1,1)),MID(sales_order_entity_varchar.value,2)), "Address") as type, 
           GROUP_CONCAT( 
             CONCAT( eav_attribute.attribute_code," ::::: ", sales_order_entity_varchar.value )
             ORDER BY sales_order_entity_varchar.value DESC
             SEPARATOR '!!!!!' 
           ) as data
      FROM sales_order_entity
           INNER JOIN sales_order_entity_varchar ON sales_order_entity_varchar.entity_id = sales_order_entity.entity_id
           INNER JOIN eav_attribute ON eav_attribute.attribute_id = sales_order_entity_varchar.attribute_id
       AND sales_order_entity.entity_type_id =12
     GROUP BY sales_order_entity.entity_id
     ORDER BY eav_attribute.attribute_code = 'address_type'
    

    주문에 대한 Exacts 주소 정보, 게으르게

    --

    요약 : 만 젠토을 경우 사용

  4. ==============================

    4.나는 놀랄 아무도없는 NoSQL 데이터베이스를 언급하지입니다.

    나는 놀랄 아무도없는 NoSQL 데이터베이스를 언급하지입니다.

    나는 생산 맥락에서 NoSQL에 연습을 한 적이 (단지 MongoDB를 테스트하고 감동했다)하지만, NoSQL에의 요점은 같은 "문서"의 다양한 속성을 가진 항목을 저장할 수있게되고.

  5. ==============================

    5.성능이 응용 프로그램의 ETL 타입과 같은 주요 요구 사항,없는 경우에는, EAV는 다른 별개의 장점이 있습니다 : 차동 저장합니다.

    성능이 응용 프로그램의 ETL 타입과 같은 주요 요구 사항,없는 경우에는, EAV는 다른 별개의 장점이 있습니다 : 차동 저장합니다.

    나는 오버 활 모양 요구 사항은 그것의 현재 상태에 대한 최초의 "버전"에서 도메인 오브젝트의 역사를 볼 수있는 능력이었다 다수의 애플리케이션을 구현했습니다. 해당 도메인 객체는 각각의 변화가 새로운 행이의 해당 테이블에 삽입 할 필요 수단은 속성의 많은 수의, (안 역사는 손실 될 수 있기 때문에 업데이 트하지만, 삽입)가있는 경우. 하자이 도메인 객체가 사람이라고, 나는 다양한 속성에 사람 라이프 사이클에 걸쳐 100 개 이상의 변화의 평균 추적 50 만 사람이있다. 커플 드문는 1 주요 도메인 개체가있는 응용 프로그램이며 신속하게 데이터베이스의 크기가 빠르게 제어 밖으로 성장할 것이라고 surmize 것이다는 사실과 함께.

    쉬운 솔루션은 주요 도메인이 반복적으로 중복 정보를 저장하는 것이 아니라 객체 만 차등 변경 사항을 저장하는 것입니다.

    모든 모델은 새로운 비즈니스 요구 사항을 반영하기 위해 시간이 지남에 따라 변경. 기간. EAV를 않고 사용에 대한 우리의 상자에서 도구 중 하나를 사용하여; 하지만 자동으로 "나쁜"로 분류해서는 안됩니다.

  6. ==============================

    6.저도 같은 문제로 고민하고 있습니다. 마 젠토 (EAV)와 줌라 (일반 관계형 구조) : 두 개의 기존 전자 상거래 솔루션에 대한 다음의 설명을 확인하는 것은 흥미로운 일이 될 수 있습니다 : https://forum.virtuemart.net/index.php?topic=58686.0

    저도 같은 문제로 고민하고 있습니다. 마 젠토 (EAV)와 줌라 (일반 관계형 구조) : 두 개의 기존 전자 상거래 솔루션에 대한 다음의 설명을 확인하는 것은 흥미로운 일이 될 수 있습니다 : https://forum.virtuemart.net/index.php?topic=58686.0

    젠토의 EAV 성능이 진짜 showstopper 것으로 보인다.

    내가 정규화 된 구조쪽으로 기울고 있어요 이유입니다. 내가 편집 할 수있는 미래 (XML 또는 별도의 DB 테이블)에서 일부 별도의 데이터 사전을 추가하는 방법에 대해 생각하고 유연성의 부족을 극복 할 것입니다 설정 새로운 속성을 제품 카테고리를 표시하고 비교하기위한 응용 프로그램 코드, 그 기반으로합니다 함께 SQL 스크립트를 생성.

    동시에 유연하고 성능이 좋은 - 이러한 구조는이 경우에 스윗 스팟 것 같다.

    문제는 실제 환경에서 ALTER 테이블의 사용 빈도가 될 수 있습니다. 그 MVCC 및 트랜잭션 DDL 잘하면 고통을 완화 있도록 나는 포스트 그레스를 사용하고 있습니다.

  7. ==============================

    7.나는 아직도 EAV의 최저 의미있는 원자 수준에서 모델링을위한 투표. 특정 사용자 커뮤니티를 향해 기어 등의 콘텐츠 모델, 속성의 반복 요구, 곡물을 결정하는 것을 표준, 기술 및 응용 프로그램을 보자

    나는 아직도 EAV의 최저 의미있는 원자 수준에서 모델링을위한 투표. 특정 사용자 커뮤니티를 향해 기어 등의 콘텐츠 모델, 속성의 반복 요구, 곡물을 결정하는 것을 표준, 기술 및 응용 프로그램을 보자

  8. ==============================

    8.그냥 제품 카탈로그 특성에 관하여 그 속성 때문에 검증 요구 사항이 오히려 제한하는 경우, EAV의 유일한 단점은 쿼리 성능과 심지어는 문제가있을 때 속성을 가진 다수의 "일"(제품)과의 질의 거래, 하지 최적 충분히 빠른있는 동안 쿼리의 성능은 "나에게 ID (234)와 제품에 대한 모든 속성을 제공합니다."

    그냥 제품 카탈로그 특성에 관하여 그 속성 때문에 검증 요구 사항이 오히려 제한하는 경우, EAV의 유일한 단점은 쿼리 성능과 심지어는 문제가있을 때 속성을 가진 다수의 "일"(제품)과의 질의 거래, 하지 최적 충분히 빠른있는 동안 쿼리의 성능은 "나에게 ID (234)와 제품에 대한 모든 속성을 제공합니다."

    하나 개의 솔루션은 제품 카탈로그의 관리 / 편집 측의 SQL 데이터베이스 / EAV 모델을 사용하고 검색 할 수 있습니다 무언가로 제품을 denormalizes 어떤 과정을하는 것입니다. 이미 속성을 가지고 있으며, 따라서 당신이 패 시팅 (faceting) 원하는 오히려 가능성 때문에,이 일이 SOLR 또는 ElasticSearch 수 있습니다. 이 방법은 EAV 모델에 기본적으로 모든 단점을 피할 수와 복잡성 갱신에 JSON에 완벽한 제품을 직렬화로 제한됩니다.

  9. ==============================

    9.EAV는 많은 단점이 있습니다 :

    EAV는 많은 단점이 있습니다 :

  10. ==============================

    10.나는 약간 다른 문제가 : 대신 (아마도 사용 EAV에 좋은 이유) 스파 스 값 많은 속성으로, 나는 더 많은 스프레드 시트와 같은 저장 뭔가 싶어. 시트의 열은 변경할 수 있지만 시트에있는 모든 세포는 (스파 스되지 않음) 데이터가 포함됩니다.

    나는 약간 다른 문제가 : 대신 (아마도 사용 EAV에 좋은 이유) 스파 스 값 많은 속성으로, 나는 더 많은 스프레드 시트와 같은 저장 뭔가 싶어. 시트의 열은 변경할 수 있지만 시트에있는 모든 세포는 (스파 스되지 않음) 데이터가 포함됩니다.

    EAV를 사용 하나, 다른 하나는 저장 셀 데이터에 Postgres를 배열을 사용 : 나는 벤치 마크에이 개 디자인을 테스트의 작은 집합을했다.

    EAV

    정렬

    두 스키마는 해당 컬럼에 인덱스를 가지고 있고, 인덱스는 계획에 의해 사용됩니다.

    그것은 배열 기반의 스키마가 크기 순서 빠른 삽입 및 쿼리 모두이었다 밝혀졌다. 빠른 검사에서, 모두가 선형 적으로 확장 보였다. 테스트는하지만, 아주 철저하지 않습니다. 제안 및 포크 환영 -들이는 MIT 라이센스하에있어.

  11. from https://stackoverflow.com/questions/870808/entity-attribute-value-database-vs-strict-relational-model-ecommerce by cc-by-sa and MIT license