2012-02-21 2 views
1

db 테이블에 저장하고있는 개체 목록 ("Phases")이 있습니다.값 표의 시퀀스를 모델링하는 좋은 방법은 무엇입니까?

목록의 Phases 순서를 유지해야합니다. 이 모델을 만드는 좋은 방법이 무엇인지 궁금하네요.

Phase 객체에 순서를 지정하는 "int sequence"속성을 지정하고 테이블에 유지되므로 이후에 순서대로 읽을 수 있다고 생각합니다. 내가 보는 유일한 문제는 시퀀스의 순서를 변경하면 목록의 모든 위상에 대한 모든 시퀀스 값을 다시 계산해야한다는 것입니다. 예를 들어 # 2와 # 3의 위치를 ​​바꾸면 # 3 이후의 모든 항목 (최대 # 1000)이 db에서 업데이트되어야합니다.

내가 고려하지 않은 모델을 만드는 더 쉬운 방법이 있습니까?

+0

왜 10 진수 순서를 사용할 수 없습니까? –

+0

당신은 일종의 연결된 목록으로 그것을 할 수 있습니다. 서언을 가지기보다는'next_phase_id '를 가지고 있습니다. 그게 더 쉬울 지 확신하지 못합니다. – Russell

+0

# 2와 # 3을 바꾸는 예제에서 다른 것을 업데이트해야한다는 의미는 아닙니다. * # 2 또는 # 3을 제거하면 모든 것을 업데이트해야합니다. – Russell

답변

1

나는 당신이 설명한대로 할 것입니다.

예, 당신은 당신이 기존의 값을 충돌 할 필요가 다음 연속 순위 값을 사용했습니다 다음 경우, 새 값을 삽입 할 당신이 일반적으로 순위 열을 만들 수없는 다음과

UPDATE table SET rank = rank + 1 WHERE rank >= ? 

말한다면 UPDATE가 처리되는 순서를 알지 못하기 때문에 고유해야합니다.

프로그래밍 방식으로 데이터베이스에 액세스하는 경우 불연속 순위 값을 허용 할 수 있으므로 기존 순위가 부울 경우에만 부딪히면됩니다 넘버링 순서에서 갭이 없다.

또한 행/페이지 기반 데이터베이스를 사용하는 경우 주 레코드의 ID와 순위 값을 가진 별도의 테이블로 순위를 결정할 수 있습니다. 그렇다면 랭킹을 대량으로 업데이트해야한다면 전체 메인 레코드를 읽고 쓰지 않아도되지만 두 개의 정수가 포함 된 간단한 레코드 일 수 있습니다.

1

다른 레코드에 영향을주지 않고 정렬 위치를 바꾸는 방법. 당신이 정렬 순서의 새 위치에 하나 개의 레코드를 이동할 때

UPDATE 
    phases 
SET 
    sort_pos = CASE WHEN sort_pos = 2 THEN 3 ELSE 2 END 
WHERE 
    sort_pos IN (2, 3) 


당신이 '폭포'효과의 종류에있는 유일한 시간이다.

sort_pos를 플로트로 저장하여 처리 할 수 ​​있습니다. 따라서 레코드를 정렬 위치 2.5으로 푸시 할 수 있습니다. 여기서 유일한 단점은 정렬 주문 9 또는 8.5이거나 실제로 다른 값이 그렇게 될 수 있으므로 "9 번째 항목 가져 오기"라는 쿼리를 작성할 수 없다는 것입니다.

관련 문제