2011-12-02 3 views
0

데이터베이스 구조의 디자인 문제가 있습니다. 목표는 고객이 일부 지역에서 제공하는 쿠폰에 대한 데이터베이스를 보유하는 것입니다. 각 오퍼는 많은 지역에서 제공 될 수 있습니다.데이터베이스 디자인 - 항목 및 지역

지역은 hierarhy에 - 예 :

subregion_1 
    subregion_11 
    region_111 
    region_112 
    subregion_12 
    region_121 
    region_122 
subregion_2 
    subregion_21 
    region_221 

이 지금은 데이터베이스에 그 제안에 대한 offer_1 지역을 저장할. offer_1 저장되면 내 offer_1이 region_111에 저장됩니다

  • 그때 나는 사용자가 subregion_1, subregion_11 및 region_111
  • 를 탐색이 제안을 표시 할 것이다 : 나는 ahieve하는 무슨 당신에게 3 개 예제를 제공합니다 subregion_11 및 region_121 지역에서 사용자가 subregion_1, subregion_11 및 subregion_11, subregion_12 및 region_121의 모든 지점을 탐색 할 때 쿠폰이 표시되어야합니다.
  • 내 offer_1이 subregion_1에 저장되면 쿠폰이 subregion_1 페이지 및 모든 지점에 표시됩니다. subregion_1.

또한 동적으로 그리고 매우 빠른 각 지역에서 다른 제안의 수를 계산하는 방법을 제공해야합니다. 누군가이 디자인을 제안하는 방법에 대한 조언이 있습니까?

내가 여기까지있다.

Regions 
------------------------------------------------------------ 
| id  | level1 | level2 | level3 | name   | level | 
------------------------------------------------------------ 
| 02  | 02  | null | null | subregion_1 | 1  | 
| 0201 | 02  | 01  | null | subregion_11 | 2  | 
| 020103 | 02  | 01  | 03  | region_111 | 3  | 
------------------------------------------------------------ 

Offers to regions 
------------------------ 
| offer_id | region_id | 
------------------------ 
| 1  | 020103 | 
| 1  | 0202  | 
------------------------ 

레벨 1, 레벨 2 및 레벨 3을 연결 한 영역에 대해 ID를 만들었습니다. Offers_to_regions 테이블에는 쿠폰과 지역이 저장됩니다. 여기에 레벨 3 (020103)의 지역과 레벨 2 (0202)의 지역 1이 있습니다. 이 디자인을 사용하면 지역마다 다른 오퍼의 수를 쿼리하는 방법과 레벨 1의 지역에 대해 오퍼를 쿼리하는 방법에 문제가 있습니다. 레벨 2 및 레벨 3 영역.

+0

지금까지 가지고있는 것을 보여주고 현재 어디에 서 있는지 구체적으로 질문하는 것이 좋습니다. – Bert

+0

어떤 종류의 데이터베이스로 작업하고 있습니까? – omarello

+0

@omarello MySQL. –

답변

1

음과 같이 부모를 가리 키도록 ID를 사용하는 확실한 방법이이

CREATE TABLE Regions (
    region_id INT AUTO_INCREMENT PRIMARY KEY, 
    parent_id INT, 
    region_name VARCHAR(100) NOT NULL, 
    FOREIGN KEY (parent_id) REFERENCES Regions(region_id) 
); 

하지만 통해 조회 너무 쉽게하지 않기 때문에 상황이이 반 패턴을 간주 될 수 계층 구조가 변경된 경우 (특히 수준 수가 변경된 경우 특별히) 경로 열거 같은 다른 방법을 사용하면 유닉스 경로와 유사한 계층 경로를 저장할 수 있습니다. 예 : 합니다 (REGION_ID에. 각각의 제안은 심판이있을 것이다) 당신의 이벤트 테이블을 조회하고, 경우에 당신이

--------------------------------------------- 
| region_id | path  | region_name  | 
--------------------------------------------- 
| 1   | 1/   | subregion_1  | 
| 2   | 1/2/  | subregion_11  | 
| 3   | 1/2/3/  | region_111  | 
| 4   | 1/2/4/  | region_112  | 
--------------------------------------------- 

이 방법은 같은 계층 구조를 저장할 수 있습니다

CREATE TABLE Regions (
    region_id INT AUTO_INCREMENT PRIMARY KEY, 
    path VARCHAR(100), 
    region_name VARCHAR(100) NOT NULL 
); 

, 브라우징 할 때 subregion_1 (ID가 1 인 경우)에 대한 쿠폰이 다음과 같이 표시 될 수 있습니다.

select Offers.SOME_COLUMN, ...... 
from Offers, Regions 
where Offers.region_id = Regions.region_id 
and Regions.path like '1/%' 

는 계층 적 데이터를 모델링하는 다른 패턴이 있습니다 당신은뿐만 아니라 조사에 관심이있을 수도와 같은 Nested Sets폐쇄 표 (maybe relevant).각 선택/삽입의 측면에서 서로 다른 장단점이 있습니다/성능을

삭제

편집 :

난 그냥 당신이 제공 한 개 이상의 지역에 속할 수 있다는 것을 또한, 귀하의 질문을 편집났습니다. 위의 내용은 하나 이상의 지역 지정을 지원하기 위해 조정이 필요할 수도 있지만 기본 아이디어는 계속 적용될 수 있습니다.

+0

하지만 offer가 subregion_1 (id = 1) 인 데이터베이스에 추가 될 경우 어떻게됩니까? 이 오퍼는 모든 지점 '1/%'에 표시되어야하지만이 경우 subregion_1 페이지에서만 볼 수 있습니까? –

+0

예를 들어 region_111, subregion_11 및 subregion_1을 탐색하는 동안 오퍼가 subergion_1 인 경우 표시해야합니까? 또한 오퍼가 region_111에 있으면 region_111, subregion_11 및 subregion_1에 표시되어야합니다. 그렇다면 계층 구조가 더 이상 hones가 될 필요가 없습니다. 오퍼링의 가시성을 정의하기 위해 다 대다 관계를 사용하십시오. – omarello

+0

예 exacly. 이것은 운전자와 승객을위한 것입니다. 승객이 area_1에서 운전자를 찾고 있다면이 지역의 운전자가 제공 한 모든 쿠폰을 보게됩니다. 즉 area_1의 더 작은 지역에서 제공되는 쿠폰을 볼 수는 있지만 지역별로 제공되는 쿠폰을 보지 못했습니다. 운전자가 area_1에 오퍼를 추가하면 그의 제안은 area_1 아래의 모든 하위 트리에서 볼 수 있습니다. 그러나 area_1의 소구역 인 area_1_1에 쿠폰을 추가하면 area_1에 area_1_1이 포함되어 있기 때문에 승객이 area_1 사이트를 방문하면 쿠폰을 볼 수 있습니다. –

관련 문제