2010-11-06 14 views
8

Estoy creando una tabla de base de datos que va a almacenar enlaces de menú que finalmente aparecerán en una página web.Cómo mantener el orden de los registros en una tabla de base de datos

Mi problema es que quiero controlar el orden de los elementos del menú. Podría tener un campo llamado orden, pero cada vez que tenga un nuevo enlace de menú tendría que insertar el pedido y cambiar todos los registros con un orden superior a +1.

Por ejemplo, digamos que quiero que los enlaces (en este orden):

 
Home 
About 
Products 
Shopping 

que podría tener una tabla llamada MenuLinks y tienen las columnas: Nombre, Orden

mi los datos se vería así:

 
Name  Order 
Home  1 
About  2 
Products 3 
Shopping 4 

pero si quisiera añadir ahora un nuevo enlace de la calle d ContactUSO pero quería aparecer justo debajo de casa.

¿Alguien puede pensar en una mejor manera de almacenar una lista que requiere ordenar en una tabla de base de datos sin este tedioso esfuerzo de mantenimiento?

Respuesta

6

Creo que esto está relacionado con el problema general del uso de una matriz frente a una lista vinculada. ¿Qué tal si almacena una clave externa que hace referencia al siguiente registro en la misma tabla? Este es el enfoque de lista enlazada.

Para su ejemplo, no hay demasiadas pestañas, por lo que un enfoque basado en arreglos debería funcionar bien. Pero para alguien que tenga cientos de registros, puede ser útil usar una clave externa autorreferencial.

ID Name  NExT 
1 Home  2 
2 About  3 
3 Products 4 
4 Shopping NULL 

adición y eliminación de filas será similar a la inserción lista enlazada y eliminación.

Actualización: tabla modificada

ID Name  NExT 
1 Home  5 
2 About  3 
3 Products 4 
4 Shopping NULL 
5 Contact us 2 

El orden será 1> 5> 2> 3> 4 como se determina por la siguiente columna. También puede usar una columna prev que la hará similar a una lista doblemente vinculada.

+0

el problema aquí es que no resuelve el problema. hacer un cambio requiere que actualice todos los registros> esa fila – leora

+2

Ningún cambio no requiere que actualice todas las filas. Si agrega Contact Us después de Home, entonces la tabla le gustaría como se muestra. Actualizado la respuesta. –

+0

Es como una actualización de la lista vinculada. –

5

Sin una ORDEN POR, no se puede garantizar el orden de los datos; normalmente, sin ORDER BY se basará en el orden de inserción.

Lamentablemente, no existe una convención que funcione bien para un orden de clasificación personalizable por el usuario.
Uno podría salirse con la suya usando funciones de análisis/ventanas/clasificación como ROW_NUMBER, pero depende de la compatibilidad con datos y bases de datos (MySQL no admite funciones analíticas, Oracle 9i +/PostgreSQL 8.4 +/SQL Server 2005+ do). Pero las funciones analíticas no ayudan si quieres que una entrada que comience con "B" aparezca antes que "A"/etc.

Sus opciones son o bien utilizar dos instrucciones para insertar un único registro:

UPDATE YOUR_TABLE 
    SET sort_order = sort_order + 1 
WHERE sort_order >= 2 

INSERT INTO YOUR_TABLE 
    (value, sort_order) 
VALUES('new value', 2) 

... o eliminar los registros existentes, y vuelva a insertar la lista en el nuevo orden.

2

debe tener en cuenta que cuando utiliza una lista vinculada, cuando desea reordenar uno de los elementos, también debe actualizar otros registros y esto debe hacerse en una transacción que no sea rápida. necesita una transacción porque todas las actualizaciones deben hacerse por completo o ninguna de ellas debe actualizarse)
hay otra solución para este problema que funciona en listas pequeñas.
Para utilizar este método, asigna un número a cada uno de sus registros. por ejemplo:

Name Number 
Home  5 
About 10 
Products 15 
shopping 20 

filas con menor número se encuentran en el begginnig de la lista y la fila con el número mayor será el último elemento de la lista de ahora aquí está el truco, si desea cambiar el orden de la productos fila y lo insertan entre el Inicio y Sobre todo lo que tiene que hacer es cambiar el campo número de su Producto a ser igual al número entre Inicio y Sobre número
el hogar número es 5 y el Sobre número es 10 por lo que el campo Número de Producto habrá (5 + 10)/2 = 7,5

Name Number 
Home  5 
About 10 
Products 7.5 
shopping 20 

y ahora se puede ordenar la final lista, basado en el Número campo

Cuestiones relacionadas