2011-04-21 2 views
2

나는 많은 범주에 속하는 많은 제품을 가지고 있습니다.하나의 "기본"값을 사용하여 many-to-many 구현하기

products: id, ... 
products_categories: product_id, category_id 
categories: id, ... 

이 지금은 많은 제품을 갖고 싶어, 하나 개의 마스터 범주 및 0 이상의 보조 카테고리 각. SQL에서 이것을 모델화하는 두 가지 방법을 생각해 볼 수 있습니다.

  1. 순수 SQL 및/또는 액티브에서이를 구현하는 가장 좋은 방법은 무엇 products

primary_category_id 열을 추가 products_categories 또는

is_primary 열을 추가 하시겠습니까? PostgreSQL을 사용하고 있습니다.

답변

1
내가

이유 (기본 범주를 가져올 때 별도의 비용이 가입 등) (2)를 선택하는 좋은 이유가없는 한 나는 첫 번째 옵션과 함께 갈 것

: 당신은 아마 PRODUCT_CATEGORY하는 기본 카테고리를 추가 할 필요를 어쨌든 (제품의 모든 카테고리를 가져 오는 것과 같은 쿼리에서 균일하고 간단한 방법으로 사용하기 위해) 옵션 1은 기본 카테고리 복제를 피하기 때문에 더 간단합니다.

1

옵션 (1)을 사용합니다. 그 이유는 제품이 둘 이상의 카테고리에 속할 수 있기 때.에 관계를 정의하는 테이블에 관계 속성 ('기본'카테고리)이 속하기 때문입니다.

나는 'is_primary'필드에 라벨을 지정하는 대신 'association_type'이라는 필드를 지정해야한다고 제안했다. 그리고 비트 필드를 추가하는 대신 정수 필드로 만들고 모든 연관 유형을 정의하십시오. 현재 귀하의 경우 두 가지 연관 유형 (보조 및 기본) 만 있습니다. 이점은이 디자인이 훨씬 더 확장 성이 있다는 것입니다. 내일이면 '기본', '보조'및 기타 모든 3 차 범주를 정의하라는 요청을받습니다.이 디자인은 '보조'필드를 지정하는 데 다른 필드를 추가하는 대신이를 처리 할 수 ​​있습니다.

1

실제로 달성하고자하는 세부 사항에 달려 있습니다. 당신에게 가장 좋은 것을 결정할 때 고려해야 할 것들이 있습니다. 다른 답변은 이미 첫 번째 경우를 처리 했으므로 두 번째 사례에 집중하겠습니다.

당신이있는 경우 primary_category_id :

  • 하나의 행 및 0에서의 1이있는 모든 product_category에서 필드를 가지고하는 것보다 기본 하나가되는 category 알려줍니다 product에 하나 개의 필드를 가지고 청소기 보인다 격차를 줄이기 위해, 비록 MR이 association_type을 사용 하자는 제안에도 깨끗하게 들릴지 모르지만, "고등"범주를 갖게 될 가능성은 얼마나 될까요?
  • 은 기본 카테고리에 도착 약간 쉽게
  • 그것은 모든 제품은 항상 기본 범주가 보장 쉽게 자동 제품은 하나 개의 기본 범주를 가질 수 적용 (단지 현장을 NOT NULL)
  • 기본 카테고리를 products_categories에 삽입해야합니까?
    • 어느 옵션도 적용되지 않습니다. 그렇지 않으면
    • , 모든 종류
    • 당신이 할 경우, 그것은 여전히 ​​쿼리하기 쉽지만, 추가 작업없이, 아무것도 기본 카테고리는 다른 테이블에 삽입 보장하지를 조회 할 수 어색

is_primary 방법을 사용하는 경우 모든 제품에 정확히 하나의 기본 카테고리가 있어야합니다.

0

장단점은 무엇입니까?

옵션 1. 제품의 기본 카테고리가 실제로 해당 카테고리 중 하나임을 확신 할 수 있습니다. 그러나 제품에 하나 이상의 기본 범주가 없다는 것을 보장하는 문제가있을 수 있습니다.

옵션 2. 이렇게하면 제품에 기본 카테고리가 하나만 있는지 확인할 수 있습니다. 그러나 그런 다음 동일한 제품 카테고리 중 하나인지 확인하는 방법이없는 것처럼 보입니다.

그래서, 나는 아마 테이블 Products_PrimaryCategories 사용하여 세 번째 옵션 갈 것입니다 :

Products_PrimaryCategories: product_id, category_id 

그것은 product_categories와 같은 것 같다,하지만 몇 가지 추가 속성이 있습니다

  • product_id을 관련 고유 색인이있어서 각 제품에 대해 하나의 기본 카테고리 만 가질 수 있습니다.

  • (product_id, category_id)은 제품의 주요 카테고리 ((product_id, category_id)products_categories의 기본 키이어야한다는 것을 의미) 하나의 카테고리임을 보장 products_categories (product_id, category_id)를 참조하는 외부 키이다.

관련 문제