precision 한계를 초과하면 오류가 발생할 가능성이 있기 때문에 별로다.
레코드의 이동 방식을 제한하는 방법도 가능하다. 가령 위 / 아래 한 칸씩 이동하게 만든다면 구현이 상당히 간단해진다. 대상 레코드에 대하여 위로 이동하는 경우, 해당 레코드의 순서에 +1을 하고 그 위의 레코드를 -1 하는 식으로 구현할 수 있다.
즉 swap 아이디어를 사용하자는 것이다. 이때, 스왑 당 2번의 update 쿼리가 발생한다. '순서'를 인덱스로 지정하고 레코드의 수가 많지 않다면, 각각의 이동을 '위 / 아래 1칸 이동'의 조합으로 표현할 수 있다. n개의 칼럼이 존재하는 경우, 가장 위 / 아래에 있는 레코드를 위로 끌어올리는 데에는 2*(n-1)회의 업데이트 쿼리가 필요하다. 한편, 순서 칼럼이 인덱스로 지정되어 있을 때 B+ Tree 조회 시간인 O(log n), 따라서 하나의 레코드를 조회하여 원하는 위치로 이동시키는 데에는 O(nlogn)의 시간 복잡도가 필요하다. 컬럼 수가 많지 않다면 충분히 고려해볼 수 있는 선택지이다.
레코드의 수가 많지 않다면 사용자가 한 칸씩 올리고 내리게 만드는 식으로 구현할 수 있다. 한칸씩 이동시키
그냥 우리가 원래 의도했던 것처럼 레코드와 레코드 사이에 드래그한 레코드를 드랍하는 식으로 작동하게 만드는 것이다.
순서 칼럼에 대하여 1번부터 n번까지 n개의 레코드가 존재할 때 n번 레코드를 1번과 2번 사이에 드롭하는 경우를 가정해보자. 먼저 n번 레코드를 2번으로 바꾸고 2번 레코드는 3번으로, 3번 레코드는 4번으로, ... , n-1번 레코드를 4번으로 업데이트 해야 한다. 즉, (n-2)개의 레코드에 대한 업데이트 쿼리가 발생한다. 동일하게 O(nlogn)이 걸린다.
- 커버링 인덱스
- h2로 테스트할 시 예약어로 인해 발생하는 문제