2014-04-08 3 views
1

행을 내 스크립트 관리 페이지로 표시하는 순서를 변경할 수 있어야합니다.
새로 추가 된 행에 대한 기본 순서가 있으며 (목록의 끝으로 이동) admin은 특정 행의 위치를 ​​변경할 수 있어야합니다.
행을 다시 배치 할 수 있도록 이중 연결 목록과 같은 행을 조작 할 것입니다.mysql에 행 순서 저장

  • mysql 행의 표시 위치를 저장하는 데 연결된 목록 방법을 사용하는 것이 좋습니까?
  • 더 좋은 방법이 있습니까?
  • 주문을 저장하기 위해 별도의 테이블을 사용해야합니까 아니면 원래 테이블에 next & prev 개의 열을 추가해도됩니까?
  • 이 방법을 사용하면 mysql order 문을 사용할 수 있습니까?

편집 : I는 (... 예를 들어, 0, 100, 200)의 이격 주문 코드를 사용하여 생각하지만 난 당신이 더 나은 것 같아요

+0

얼마나 많은 행이있을 것으로 예상합니까 ... 더 정교한 무엇을 구현하기 전에 데이터의 대표 양의 간단한 순서 필드 접근 방식을 벤치마킹 좋을 걸? 연결된 목록 접근법은 마른 동안 빌드하기가 복잡하지만, 예를 들어 모든 행을 새로운 순서로 업데이트하는 데 더 많은 권한이 필요합니다. 행이 많지 않으면 각각의 현재 정렬 순서를 저장하는 간단한 열과 순서가 바뀔 때마다 일괄 적으로 모든 항목 (영향을받는 모든 항목> 변경 사항)을 일괄 적으로 업데이트합니다. –

+0

@MichaelBerkowski : 100 만 개가 넘는 행이있을 수 있습니다. – RYN

+1

수백만 개가 항상 일괄 업데이트됩니다.하지만 수동으로 주문하는 것은 무리한 것처럼 보입니다. 연결된 목록의 문제는 쿼리를 쿼리하고 올바른 순서를 다시 가져 오는 것과 같이 목록을 저장하는 것이 아닙니다. –

답변

1

에 도달 할 수있는 한계가있다 링크 된 목록을 구현하는 대신 전용 필드에 순서 지정 위치를 저장하는 것이 좋습니다.

링크 된 목록의 문제는 주문을 사용자에게 표시하기 전에 순서를 "재구성하는"일종의 목록 통과가 필요하다는 것입니다. 일반적으로 재귀 쿼리를 사용하면 재귀 쿼리를 사용할 수 있지만 유감스럽게도 MySQL은 재귀 쿼리를 지원하지 않으므로 저장 프로 시저를 사용하거나 각 목록마다 데이터베이스 왕복을해야합니다 마디.

전체적으로 때때로 수 차례에 걸쳐 여러 행의 주문 필드를 업데이트하면 (순서를 변경할 필요가있을 때) 매번 (필요할 때마다) 목록을 탐색하는 것보다 비용이 적게 듭니다. 작은 거리로 행. 그리고 갭을 도입하면 (앞에서 언급했듯이) 실제로 업데이트해야하는 행 수가 크게 늘어나 복잡성이 증가합니다.

InnoDB에서 제공하는 clustering 메커니즘으로 주문 필드를 피기 백 할 수도 있습니다.

YMMV은 물론,하지만 난