2010-04-16 4 views
1

너무 많은 사람들이 데이터베이스 스키마 Products /Product Properties을 찾고 있습니다. 루비 온 레일즈 (Ruby on Rails)와 스핑크스 (Sphinx)를 사용하여 측면 검색을하고 있습니다.제품 속성에 대한 데이터베이스 스키마

요구 사항 :

  • 새로운 제품 유형과 옵션을 추가하면
  • 지원 측면 검색이 스핑크스를 사용하여 데이터베이스 스키마에 대한 변경을 요구해서는 안된다.

솔루션은 내가 건너했습니다
(See Bill Karwin's answer)

옵션 1 : 단일 테이블 상속

하지 옵션 정말. 테이블은 많은 컬럼에 대한 길을 포함합니다.

옵션 2 : 레일에 클래스 표 상속

루비는 제품의 새로운 유형이 도입 될 때마다 다시 시작을 의미 시작에 대한 데이터베이스 스키마를 캐시합니다. 유능한 제품 카탈로그가 있으면 수백 개의 테이블을 의미 할 수 있습니다.

옵션 3 : 직렬화 된 LOB 무거운 응용 프로그램 논리없이 측면 검색을 수행 할 수있는

킬은.

옵션 4 : 엔티티 - 속성 - 값 테스트 목적으로

는 EAV 괜찮 았는데. 그러나 옵션이 추가 될 때 (예 : 옵션이 가격 또는 배달 시간을 늘릴 때) 신속하게 혼란과 유지 보수가 될 수 있습니다.


어떤 옵션을 사용해야합니까? 거기에 다른 해결책이 있습니까? 내가 간과 한은 총알 (하)이 있습니까?

+0

나는 2 명의 사람을 여기에서 저쪽에 수송 할 수있는 차량을 짓는 것을 말하는 것이 다소 좋다. 오, 내가 심해 다이빙이나 오프로드 또는 날아 가기를 원한다면 수정없이 동일한 차량을 사용할 수 있어야합니다. –

답변

2

IMO, 클래스 테이블 상속과 몇 가지 심각한 제한이있는 EAV의 조합이 가장 좋은 방법입니다.

EAV는 약물과 비슷합니다. 소량이고 환경이 좁은 세트는 유익 할 수 있습니다. 너무 많이하면 널 죽일거야. 스키마 의 주요 부분 인 EAV는이됩니다. 질문 없음. 그러나 적절한 데이터베이스 스키마에 대한 보충 자료로서 적절한 제한 사항을 적용 할 경우 유용 할 수 있습니다.

EAV의 주요 규칙은 결코'[AttributeCol] = 'Attribute'을 포함하는 쿼리를 작성할 수 있다는 것입니다. 즉, 범위 내에서 필터, 정렬, 제한을 수행하거나 보고서 또는 양식의 특정 위치에 배치 할 수 없습니다. 이것은 단순히 보고서의 전체 또는 화면의 화면에서 침을 뱉을 수있는 데이터 모음입니다. 실제로 필자는 사람들이이 기능을 Xml 열로 구현하는 것을 보았습니다.

이 제한 사항을 유지할 수있는 경우 사용자가 저장 용도로만 속성 집합을 제품에 추가 할 수 있도록 EAV 구조를 클래스 테이블 상속 설계에 추가 할 수 있습니다.속성을 사용하여 verboten 태스크를 수행하고자하는 순간, 그것은 반드시 1 급 컬럼이되고 모든 것이 포함되어야합니다.

키가 집행 중입니다. EAV 구조의 사용에 대해 합리적으로 시행하거나 다른 개발자가이 제한을 적용 할 수 있다고 생각하지 않는다면 건너 뛰는 것이 합리적 일 수 있습니다. 그러나이 제한 사항을 적용 할 수 있다면 스토리지 및 추적 용도로만 수 많은 속성을 추가하려는 사람들의 문제를 해결할 수 있습니다.

+0

건배, 나는 제품에 대해 MongoDB를 사용하기로 결정했다. – Chemosh

관련 문제