Pregunta

En nuestra aplicación web, los resultados de la búsqueda se muestran en tablas ordenables.El usuario puede hacer clic en cualquier columna y ordenar el resultado.El problema es que, a veces, el usuario realiza una búsqueda amplia y obtiene una gran cantidad de datos.Para que la parte ordenable funcione, probablemente necesite todos los resultados, lo que lleva mucho tiempo.O puedo recuperar algunos resultados a la vez, pero luego ordenar no funcionará bien.¿Cuál es la mejor práctica para mostrar tablas ordenables que pueden contener muchos datos?


Gracias por todos los consejos.Ciertamente los repasaré.

Estamos utilizando un marco de Javascript existente que tiene la tabla ordenable;"muchos" resultados significa cientos.El problema es que nuestros usuarios se encuentran en algún sitio remoto y hay un gran retraso en el tiempo de la red para enviar/recibir datos desde el centro de datos.Es bueno ordenar los datos en el lado de la base de datos y enviar solo una página de resultados a la vez;pero cuando el usuario hace clic en el encabezado de alguna columna, se realiza otro viaje de ida y vuelta, que siempre agrega de 3 a 4 segundos.

Bueno, supongo que ese podría ser el problema del equipo de red :)

¿Fue útil?

Solución

Usar clasificación y paginación a nivel de base de datos es la respuesta correcta.Si su consulta devuelve 1000 filas, pero solo le mostrará al usuario 10 de ellas, no es necesario que las otras 990 se envíen a través de la red.

Aquí hay un ejemplo de mysql.Supongamos que necesita 10 filas, 21-30, de la tabla "personas":

SELECT * FROM people LIMIT 21, 10 

Otros consejos

Deberías volver a paginar en el servidor de la base de datos.P.ej.en SQL 2005 y SQL 2008 existen técnicas de paginación.Sugeriría buscar opciones de paginación para cualquier sistema que esté viendo.

¿Qué base de datos está utilizando? Hay alguna buena opción de paginación en SQL 2005 y versiones posteriores que usan ROW_NUMBER para permitirle realizar paginación en el servidor.Encontré este bueno en El blog de Christian Darié

Por ejemplo, este procedimiento que se utiliza para paginar productos en una categoría.Simplemente pasa el número de página que deseas y el número de productos en la página, etc.

CREATE PROCEDURE GetProductsInCategory
(@CategoryID INT,
@DescriptionLength INT,
@PageNumber INT,
@ProductsPerPage INT,
@HowManyProducts INT OUTPUT)
AS

-- declare a new TABLE variable
DECLARE @Products TABLE
(RowNumber INT,
 ProductID INT,
 Name VARCHAR(50),
 Description VARCHAR(5000),
 Price MONEY,
 Image1FileName VARCHAR(50),
 Image2FileName VARCHAR(50),
 OnDepartmentPromotion BIT,
 OnCatalogPromotion BIT)

-- populate the table variable with the complete list of products
INSERT INTO @Products
SELECT ROW_NUMBER() OVER (ORDER BY Product.ProductID),
       Product.ProductID, Name, 
       SUBSTRING(Description, 1, @DescriptionLength) + '...' AS Description,
       Price, Image1FileName, Image2FileName, OnDepartmentPromotion, OnCatalogPromotion
FROM Product INNER JOIN ProductCategory
  ON Product.ProductID = ProductCategory.ProductID
WHERE ProductCategory.CategoryID = @CategoryID

-- return the total number of products using an OUTPUT variable
SELECT @HowManyProducts = COUNT(ProductID) FROM @Products

-- extract the requested page of products
SELECT ProductID, Name, Description, Price, Image1FileName,
       Image2FileName, OnDepartmentPromotion, OnCatalogPromotion
FROM @Products
WHERE RowNumber > (@PageNumber - 1) * @ProductsPerPage
  AND RowNumber <= @PageNumber * @ProductsPerPage

Podrías hacer la clasificación en el servidor.AJAX eliminaría la necesidad de una actualización completa, pero aún así habría un retraso.Además, las bases de datos generalmente son muy rápidas de clasificar.

Para estas situaciones, empleo técnicas del lado de SQL Server que no solo aprovechan la base de datos para la clasificación, sino que también utilizan paginación personalizada para devolver SÓLO los registros específicos necesarios.

Es un poco complicado implementarlo al principio, ¡pero el rendimiento después es increíble!

¿Qué tamaño tiene "una gran cantidad" de datos?¿Cientos de filas?¿Miles?

La clasificación se puede realizar a través de JavaScript sin problemas con Mesas clasificables Mochikit.Sin embargo, si los datos tardan mucho en ordenarse (muy probablemente uno o dos segundos [¡o tres!]), entonces es posible que desee darle al usuario alguna señal visual de que algo está sucediendo y que la página no se congeló.Por ejemplo, tiñe la pantalla (al estilo Lightbox) y muestra una animación o texto de "clasificación".

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