Pregunta

Estoy creando un sitio web de videos donde se anidarán categorías:

p.ej.Programación-> C Language -> Videos del MIT -> Video 1 Programación -> C Language -> Video de Stanford -> Video 1 Programación -> Python -> Video 1

Estas categorías y subcategorías serán creadas por los usuarios sobre la marcha.Tendré que mostrarlos a medida que las personas los crean en forma de menú navegable, para que puedan explorar la colección fácilmente.

¿Alguien podría ayudarme a saber cómo puedo crear una base de datos de este tipo?

¿Fue útil?

Solución

Quassnoi dijo:

  

Debe utilizar cualquiera de los conjuntos anidados o modelos de padres e hijos.

He utilizado para implementar los dos. Lo que puedo decir es:

Utilice la arquitectura del conjunto anidado si su tabla de categorías no cambia a menudo, porque en una cláusula select es rápido y con una sola solicitud se puede obtener toda la rama de la jerarquía para una entrada dada. Pero en una cláusula de inserción o actualización que se necesita más tiempo que un modelo de padre-hijo para actualizar los campos izquierdo y derecho (o inferior y superior en el ejemplo a continuación).

Otro punto, bastante trivial, debo admitir, pero:
Es muy difícil cambiar la jerarquía con la mano directamente en la base de datos (que podría ocurrir durante el desarrollo). Por lo tanto, asegúrese de aplicar primero una interfaz para jugar con el conjunto anidado (cambiando nodo padre, mover un nodo rama, la eliminación de un nodo o toda la rama etc.)

Aquí hay dos artículos sobre el tema:

La última cosa, yo no lo probé, pero leído en alguna parte que usted puede tener más de un árbol en una tabla conjunto anidado, me refiero a varias raíces.

Otros consejos

Hacer una tabla de categorías con los siguientes campos:

  • CategoryID - Entero
  • CategoryName - Cadena / Varchar / Sea cual sea
  • ParentID - Entero

Su ParentID será después hacer referencia de nuevo a la CategoryID de su padre.

Ejemplo:

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

A partir del ejemplo en su pregunta que parece que te gustaría que fuera posible para una determinada categoría tenga múltiples padres (por ejemplo, "MIT Videos -> Video 1 Programación", así como "Video -> Video 1 Programación "), en cuyo caso simplemente añadiendo una columna ParentID no sería suficiente.

Yo recomendaría la creación de dos tablas: una sencilla tabla de categorías con las columnas IdCategoría y una mesa, y CategoryRelationships independiente con columnas ParentCategoryID y ChildCategoryID. De esta manera usted puede especificar tantas relaciones padre-hijo como desee para cualquier categoría en particular. Incluso sería posible utilizando este modelo para tener una relación dual en dos categorías son padre e hijo de uno al otro al mismo tiempo. (De la parte superior de mi cabeza, no puedo pensar en un gran uso para este escenario, pero al menos se ilustra cuán flexible es el modelo.)

Deberías usar cualquiera de los dos nested sets o parent-child modelos.

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
        )

seleccionará a todos los compradores en 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

seleccionará todos los compradores en cualquier base de datos.

Ver esta respuesta para más detalles.

Nested sets Es más fácil de consultar, pero es más difícil de actualizar y de construir una estructura de árbol.

Lo que necesita es una relación básica entre padres e hijos:

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

Una mejor manera de almacenar el parent_id de la mesa es tener que anida dentro de la ID por ejemplo

100 000 Programación 110000 C Idioma 111000 Video 1 Programación 111100 C Idioma 111110 Stanford vídeo

etc..so todo lo que se necesita un script para procesar el ID de manera que el primer dígito representa la categoría de nivel superior y así sucesivamente a medida que avanza a mayor profundidad la jerarquía

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top