2016-07-04 4 views
0

다음과 같은 경우가 있습니다. 중첩 된 집합 모델을 사용하여 계층 적 데이터를 저장하고 있습니다. 이 모델은 특정 클라이언트에게만 특정 하위 범주를 사용할 수있는 옵션을 추가하려는 경우를 제외하고는 거의 동일합니다. 테이블을 편집하는 것은 데이터베이스에 새 테이블을 다시 보내는 VB.NET 응용 프로그램에서 외부 적으로 수행됩니다.클라이언트 전용 노드가있는 중첩 세트 모델

나는 이것을 달성하기위한 두 가지 다른 옵션을 생각해 보았습니다. 첫 번째는 클라이언트 ID를 연결하는 새 client_id 필드를 추가하는 것입니다. 그런 다음 쿼리를 수행하여 문자열에서 특정 숫자를 찾습니다. # 1은 모든 사용자를 가리키는 반면, 다른 숫자는 특정 클라이언트를 나타냅니다.

+-------------+----------------------+-----+-----+---------+ 
| category_id | name     | lft | rgt |client_id| 
+-------------+----------------------+-----+-----+---------- 
|   1 | MAINCAT1    | 1 | 20 |  1| 
|   2 | subcat1    | 2 | 9 |  2;4| 
|   3 | subcat2    | 3 | 4 |  3| 
|   4 | subcat3    | 5 | 6 |  1| 
|   5 | subcat4    | 7 | 8 |  2;3| 
|   6 | MAINCAT2    | 10 | 19 |  1| 
|   7 | subcat1    | 11 | 14 |  1| 
|   8 | subcat2    | 12 | 13 |  1| 
|   9 | subcat3    | 15 | 16 |  3;4| 
|   10 | subcat4    | 17 | 18 |  3;4| 
+-------------+----------------------+-----+-----+---------+ 

두 번째 옵션은 모든 클라이언트에 대해 새 필드를 추가하고 일종의 표식 (예 : 1/0)을 사용하여 범주를 활성화/비활성화합니다.

+-------------+----------------------+-----+-----+---------+---------+ 
| category_id | name     | lft | rgt |client_2 |client_3 
+-------------+----------------------+-----+-----+---------+---------+ 
|   1 | MAINCAT1    | 1 | 20 |  1|  1| 
|   2 | subcat1    | 2 | 9 |  0|  1| 
|   3 | subcat2    | 3 | 4 |  0|  1| 
|   4 | subcat3    | 5 | 6 |  1|  0| 
|   5 | subcat4    | 7 | 8 |  1|  0| 
|   6 | MAINCAT2    | 10 | 19 |  1|  1| 
|   7 | subcat1    | 11 | 14 |  0|  1| 
|   8 | subcat2    | 12 | 13 |  0|  1| 
|   9 | subcat3    | 15 | 16 |  1|  0| 
|   10 | subcat4    | 17 | 18 |  0|  1| 
+-------------+----------------------+-----+-----+---------+---------+ 

필드 추가/제거가 필요하지 않으므로 첫 번째 옵션을 선호합니다. 나는 쿼리를 수행하는 것이 더 느릴 것이라고 생각하지만 테이블을 매우 길게 만들지는 않을 것입니다. 어떤 방법이 더 적절하다고 생각합니까?

+0

함께 가지 마십시오. lft, rgt 인접 목록으로 이동하십시오. CSV는 우습다. 두 번째 직업 경력자 것입니다. – Drew

+0

저는 이미 lft, rgt를 사용하고 있습니다. –

+0

맨 덩어리, 마지막 열에있는 csv와 함께 가지 마십시오. – Drew

답변

0

첫 번째 옵션은 잠재적으로 매우 큰 문자열에서 일치하는 ID를 찾는 것을 의미하며 궁극적으로 해당 카테고리를 볼 수있는 클라이언트 수를 제한합니다. 이 작업을 수행해야한다면 (필자가 반대하는 경우) 적어도 FIND_IN_SET() 함수를 사용할 수 있으면 목록을 쉼표로 구분하십시오.

두 번째 옵션은 클라이언트 당 열을 필요로하는 것처럼 보입니다. 더 많은 클라이언트를 확보 할 때 악몽이 될 것입니다.

각 카테고리별로 여러 개의 행이있는 테이블을 제안합니다. 각 테이블은 해당 카테고리를 볼 수 있습니다. 간단한 참여를 사용하여 관련 클라이언트가 카테고리를 볼 수 있는지 확인할 수 있습니다.

EDIT-2 테이블 솔루션은 범주를 클라이언트에 연결하는 테이블을 추가하는 것을 의미합니다. 이런 간단한 테이블 : -

CREATE TABLE category_client 
(
    category_id INT(11), 
    client_id INT(11), 
    PRIMARY KEY (`category_id`, `client_id`), 
    KEY `client_id` (`client_id`) 
); 

INSERT INTO TABLE category_client (client_id, category_id) VALUES 
(1, 1, 
(2, 2), 
(2, 4), 
(3, 3), 
(4, 1), 
(5, 2), 
(5, 3), 
(6, 1), 
(7, 1), 
(8, 1), 
(9, 3), 
(9, 4), 
(10, 3), 
(10, 4); 
+0

안녕하세요, 자세히 설명해 주시겠습니까? –

+0

@StanislavLazarov - 제안 된 두 번째 테이블 – Kickstart

+0

제안 해 주셔서 감사합니다. 그것은 완벽하게 작동합니다! –