데이터베이스에서 중첩 카테고리를 어떻게 작성합니까?
-
06-09-2019 - |
문제
카테고리가 중첩 될 동영상 웹 사이트를 만들고 있습니다.
예 : 프로그래밍 -> C 언어 -> MIT 비디오 -> 비디오 1 프로그래밍 -> C 언어 -> 스탠포드 비디오 -> 비디오 1 프로그래밍 -> Python-> 비디오 1
이러한 범주 및 하위 범주는 사용자가 즉시 생성됩니다. 사람들이 탐색 가능한 메뉴의 형태로 만들어서 사람들이 컬렉션을 쉽게 탐색 할 수 있도록 그들을 보여 주어야합니다.
누군가 그런 데이터베이스를 만드는 방법을 어떻게 도와 줄 수 있습니까?
해결책
Quassnoi는 다음과 같이 말했습니다.
중첩 세트 또는 부모-자식 모델을 사용해야합니다.
나는 둘 다 구현했었다. 내가 말할 수있는 것은 :
카테고리 테이블이 자주 변경되지 않으면 중첩 세트 아키텍처를 사용하십시오. 선택 조항에서는 빠르고 하나의 요청 만 있으면 주어진 항목에 대한 계층 구조의 전체 분기를 얻을 수 있기 때문입니다. 그러나 삽입 또는 업데이트 조항에서는 왼쪽과 오른쪽 (또는 아래 예제의 하단 및 상단) 필드를 업데이트하는 데 부모 하위 모델보다 시간이 더 걸립니다.
또 다른 요점, 나는 매우 사소한 것을 인정해야하지만 : :
데이터베이스에서 직접 계층 구조를 직접 변경하는 것은 매우 어렵습니다 (개발 중에 발생할 수 있음). 따라서 먼저 중첩 세트와 함께 재생할 인터페이스를 구현해야합니다 (부모 노드 변경, 분기 노드 이동, 노드 또는 전체 분기 등).
주제에 관한 두 가지 기사는 다음과 같습니다.
마지막으로, 나는 그것을 시도하지 않았지만, 당신이 중첩 된 세트 테이블에 둘 이상의 나무를 가질 수 있다는 어딘가에 읽었습니다. 나는 여러 뿌리를 의미합니다.
다른 팁
다음 필드로 카테고리 테이블을 만듭니다.
- CategoryId- 정수
- CategoryName -String/Varchar/뭐든지
- 부모 - 정수
그런 다음 부모님은 부모의 범주를 다시 언급합니다.
예시:
CategoryID CategoryName ParentID
---------------------------------
1 Dog NULL
2 Cat NULL
3 Poodle 1
4 Dachsund 1
5 Persian 2
6 Toy Poodle 3
질문의 예에서 주어진 카테고리가 여러 부모 (예 : "MIT 비디오 -> 비디오 1 프로그래밍"및 "비디오 -> 비디오 1 프로그래밍")를 가질 수 있기를 원한다고 생각합니다. 이 경우 단순히 부모 열을 추가하는 것만으로는 충분하지 않습니다.
CategoryID 및 CategoryName 열이있는 간단한 카테고리 테이블과 ParentCategoryID 및 ChildCategoryID 열이있는 별도의 CategoryRelationship 테이블의 두 가지 테이블을 만드는 것이 좋습니다. 이렇게하면 특정 범주에 대해 원하는만큼 부모-자식 관계를 지정할 수 있습니다. 이 모델을 사용하여 두 가지 범주가 서로의 부모와 자녀 인 동시에 이중 관계를 가질 수 있습니다. (내 머리 꼭대기에서, 나는이 시나리오에 큰 사용을 생각할 수 없지만 적어도 모델이 얼마나 유연한지를 보여줍니다.)
당신은 어느 쪽이든 사용해야합니다 nested sets
또는 parent-child
모델.
Parent-child
:
typeid parent name 1 0 Buyers 2 0 Sellers 3 0 Referee 4 1 Electrical 5 1 Mechanic
SELECT *
FROM mytable
WHERE group IN
(
SELECT typeid
FROM group_types
START WITH
typeid = 1
CONNECT BY
parent = PRIOR typeid
)
모든 구매자를 선택합니다 Oracle
.
Nested sets
:
typeid lower upper Name 1 1 2 Buyers 2 3 3 Sellers 3 4 4 Referee 4 1 1 Electrical 5 2 2 Mechanic
SELECT *
FROM group_types
JOIN mytable
ON group BETWEEN lower AND upper
WHERE typeid = 1
모든 데이터베이스에서 모든 구매자를 선택합니다.
보다 이 답변 자세한 내용은.
Nested sets
쿼리가 더 쉽지만 업데이트하기가 어렵고 트리 구조를 구축하기가 더 어렵습니다.
필요한 것은 기본적인 부모-자식 관계입니다.
Category (ID: int, ParentID: nullable int, Name: nvarchar(1000))
테이블의 parent_id를 저장하는 더 좋은 방법은 id 안에 중첩되는 것입니다.
100000 프로그래밍 110000 C 언어 111000 비디오 1 프로그래밍 111100 C 언어 111110 스탠포드 비디오
ETC .. 따라서 첫 번째 자리가 최상위 범주를 나타내도록 ID를 처리하기 위해 스크립트가 필요합니다.