Como faço para criar categorias aninhadas em um banco de dados?
-
06-09-2019 - |
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?
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 ??strong> 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