Pergunta

Eu estou fazendo um site vídeos onde as categorias serão aninhados:

por exemplo. Programação-> C Idioma -> MIT Vídeos -> Video 1 Programação -> C Idioma -> Stanford Vídeo -> Video 1 Programação -> Python -> Video 1

Estas categorias e sub-categorias serão criados pelos utilizadores em tempo real. Vou precisar para mostrar-lhes como as pessoas criá-los na forma de um menu navegável, para que as pessoas podem navegar na coleção facilmente.

Alguém poderia me ajudar com como eu posso ir sobre a criação de uma tal base de dados?

Foi útil?

Solução

Quassnoi disse:

Você deve usar tanto conjuntos aninhados ou modelos de pais e filhos.

I usado para implementar os dois. O que eu poderia dizer é:

Use o conjunto de arquitetura aninhada se sua tabela categorias não muda frequentemente, porque em uma cláusula select é rápido e com apenas um pedido, pode obter toda a ramificação da hierarquia para uma dada entrada. Mas em uma cláusula de inserção ou atualização leva mais tempo do que um modelo de filho de pai para atualizar a esquerda e para a direita (ou inferior e superior no exemplo abaixo) campos.

Outro ponto, bastante trivial devo admitir, mas:
É muito difícil mudar a hierarquia à mão diretamente no banco de dados (isso pode acontecer durante o desenvolvimento). Então, certifique-se de implementar primeiro uma interface para jogar com o conjunto aninhado (mudando nó pai, mova um nó ramo, a exclusão de um nó ou todo o ramo etc.)

Aqui estão dois artigos sobre o assunto:

A última coisa, eu não tentar isso, mas eu li em algum lugar que você pode ter mais de uma árvore em uma tabela de conjunto aninhado, quero dizer várias raízes.

Outras dicas

Faça uma tabela de categorias com os seguintes campos:

  • CategoryID - Integer
  • CategoryName - Cordas / Varchar / Qualquer que seja
  • ParentID - Integer

Seu ParentID, então, referência de volta para o CategoryID de seu pai.

Exemplo:

CategoryID CategoryName ParentID
---------------------------------
1          Dog          NULL
2          Cat          NULL
3          Poodle       1
4          Dachsund     1
5          Persian      2
6          Toy Poodle   3

A partir do exemplo na sua pergunta, parece que você quer que ele seja possível para uma determinada categoria de ter vários pais (por exemplo, "MIT Vídeos -> Video 1 programação", bem como "Video -> Video 1 Programação "), no caso de simplesmente adicionando uma coluna ParentID que não seria suficiente.

Eu recomendaria a criação de duas tabelas: uma tabela de categorias simples com colunas e NomeDaCategoria, e uma mesa CategoryRelationships separado com colunas ParentCategoryID e ChildCategoryID. Desta forma, você pode especificar quantas relações pai-filho como você deseja para qualquer categoria particular. Seria mesmo possível usar este modelo para ter uma relação dual, onde duas categorias são pai e filho do outro simultaneamente. (Em cima da minha cabeça, eu não posso pensar de uma grande utilidade para este cenário, mas pelo menos ele ilustra o quão flexível é o modelo.)

Você deve usar tanto modelos nested sets ou 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
        )

vai selecionar todos os compradores em 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

vai selecionar todos os compradores em qualquer banco de dados.

esta resposta para obter mais detalhes.

Nested sets é mais fácil de consulta, mas é mais difícil de atualização e mais difícil de construir uma estrutura de árvore.

O que você precisa é um relacionamento básico entre pais e filhos:

Category (ID: int, ParentID: nullable int, Name: nvarchar(1000))

A melhor maneira de armazenar o parent_id da tabela é tê-lo aninhada dentro da ID por exemplo

100000 Programação 110000 C Idioma 111000 Video 1 Programação 111100 C Idioma 111110 Stanford Vídeo

etc..so tudo que você precisa que um script para processar o ID de tal forma que o primeiro dígito representa a categoria de nível superior e assim por diante como você ir mais fundo para baixo na hierarquia

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top