문제

카테고리가 중첩 될 동영상 웹 사이트를 만들고 있습니다.

예 : 프로그래밍 -> 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를 처리하기 위해 스크립트가 필요합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top