페이지 매김 및 분류 문제
-
06-07-2019 - |
문제
서버 측면에서 정렬을 통해 클라이언트 측 테이블 정렬에 의존해야 할 때 데이터베이스 지향 웹 애플리케이션의 상황을 조사하고 있습니다. 나를 괴롭히는 한 가지 특별한 상황은 페이지 매김입니다.
큰 테이블 (10000 행)을 페이지를 쉽게 잡고 특정 열로 정렬하려고 할 때 가장 좋은 방법은 무엇입니까?
이와 관련된 몇 가지 문제는 다음과 같습니다.
- 한 번에 전체 테이블을 클라이언트쪽으로 돌려 줄 수 없습니다.
- JavaScript로 10000 레코드를 정렬 할 수 없습니다.
- 테이블을 정렬하면 현재 페이지뿐만 아니라 모든 페이지에서 행을 정렬해야합니다.
이 목록에 추가 할 더 이상 문제가 있습니까?
어떤 접근 방식이 서버로드가 최소화되도록 클라이언트 측과 서버 측 상호 작용을 잘 혼합하게 할 것인가?
덧셈:
자, 데이터베이스를 정렬하고 Reqd 페이지를 반환하는 것이 가장 좋은 방법 인 것 같습니다.
이제 이것을 고려하십시오 :
사용자는 일련 번호별로 정렬 된 테이블의 페이지 (3/10)에 있습니다. 이제 사용자는 "username"이라는 헤더를 클릭하여 사용자 이름별로 테이블을 정렬하려고합니다.
quesion : 최종 결과가 "페이지 (1/10)가 사용자 이름으로 정렬 된 경우"또는 "페이지 (3/10)가 사용자 이름으로 정렬되어야합니까?
나는 이것이 매우 주관적인 질문이라는 것을 알고 있지만, 당신은 무엇을 추천하고 그 이유는 무엇입니까?
해결책
클라이언트 측은 간단하게 유지됩니다. JavaScript 정렬/페이징은 매우 작은 결과 세트에만 해당됩니다. 사용자가 성능이 적용되지 않을 정도로 작습니다.
서버 측은 서버로드를 최적화 할 수있는 곳입니다.
로드는 더 많은 페이지에 대한 자주 요청, 페이지 당 다수의 행/열 및 자주 의지 요청의 형태로 제공 될 수 있습니다. (우리는 필터링에 대해서도 이야기하지 않았습니다)
따라서 사용자에 따라 실제 사용, 당신은 어떤 형태의 캐싱이 필요할 수 있습니다. 이는 사용자가 무엇을하는지 알고 난 후에 한동안 제안입니다.
빈번한 페이지 요청의 경우 일부 AJAX 요청이 다음 몇 페이지 (및 이전) 페이지를 사전로드 한 다음 사용자 요청에 따라 행 (JavaScript를 통해)을 테이블로 바꾸는 것을 고려하십시오.
큰 페이지 크기의 경우 행을 "가장 많이 사용되는"응용 프로그램 (메모리) 캐시에 유지하여 데이터베이스가 동일한 거대한 데이터 덩어리를 반복해서 뱉어 내지 않도록 고려하십시오.
자주 의지하는 경우 좋은 접근 방식은 결과만으로 캐시 테이블을 SQL로 유지하는 것입니다.
그리고 항상, 항상, 항상 데이터베이스를 적절하게 색인하십시오.
추가 응답 :
나의 주관적인 반응은 이것입니다. 사용자 (ME)는 임의의 페이지에서 정렬하기를 원합니다. 그들을 (나)하자. 당신이 원하는 곳에있는 것보다 더 성가신 것은 없으며, 응용 프로그램이 목록의 시작 부분으로 돌아가는 것입니다.
또 다른 고려 사항은 여러 수준의 정렬입니다. 일련 번호별로 정렬을 구현 한 다음 사용자 이름을 구현 하시겠습니까? Microsoft Excel이하는 일 또는 사용자가 익숙한 다른 응용 프로그램을 고려하십시오. 사용자는 아마도 1 페이지로 돌아가는 것을 포함하여 자신이 익숙한 것에 대해 괜찮을 것입니다.
다른 팁
데이터베이스는 데이터 정렬 및 선택에있어 진정한 짐승입니다. 따라서 최선의 방법은 클라이언트가 서버에 "Z로 정렬 된 y 행이있는 Page X를 원한다"고 말하는 것입니다. 그런 다음 데이터베이스가 그 일을하고 클라이언트가 결과를 보여줍니다. 성능을 향상시키기 위해 클라이언트 캐시 결과를 만들 수 있으며, 현재 페이지가 요청시 즉시 표시 될 수 있도록 현재 페이지와 이전 페이지가 다음 페이지를 요청한 후 코드가 다음 페이지와 이전 페이지를 요청할 수 있습니다.
가장 좋은 방법은 데이터베이스 수준에서 정렬 및 페이징을 수행하고 화면에만 표시되는 원래 데이터의 하위 집합 만 반환하는 것입니다. 이 시나리오에서는 JavaScript가 없습니다.
몇 가지 이유로 데이터베이스 수준에서 정렬 할 수없는 경우 서버 측 스크립트로 수행해야합니다. 이 시나리오에서도 JavaScript도 없습니다.
그리고 최악의 접근법은 분명한 이유로 전혀 권장되지 않는 JavaScript로 정렬 및 페이징을 수행하는 것입니다.
DB가 화면의 특정 페이지로 전달되는 내용을 정렬하도록하십시오. 거의 항상 더 빠르고, 캐싱되며 브라우저에서 이러한 하중을 완화시킵니다.
원하는 경우 클라이언트 측에 데이터가 충분히 자세하고 이익을 얻을 수있는 경우 JavaScript 등을 통해 추가 하위 분류를 허용하십시오. 페이지간에 기억되도록 선택한 하위 소송 기능을 저장할 수 있습니다.