2012-02-23 6 views
0

다음과 같은 문제가 있습니다. 삭제 및 삽입만으로 "dif"테이블을로드하고 있습니다. "변경"은 삭제 다음에 삽입으로 결정됩니다.테이블의 행 순서

이 테이블에는 기본 키가없고 주문할 필드가 없습니다. 나는이 테이블을로드하기 위해 Hibernate를 사용하고자한다. (SELECT obj FROM MyDifTable obj WHERE obj.group = groupId)

지금은 모든 값과 위 쿼리에 대한 키를 사용하고 있으며 소스 테이블과 동일한 순서로 행을 가져 오지 않았습니다.

내 질문은 :

  1. 어떻게 Hibernate는 항상 테이블에서와 같은 순서를 반환 할 수 있습니까?
  2. 이 경우 기본 키를 지정하는 방법은 무엇입니까?

나는 이것이 매우 나쁘게 설계된 것으로 알고 있으며, 설계 팀과 논쟁을 시도했지만 성공하지는 못했습니다.

최고 감사는 카이

+2

일반적으로 'ORDER BY'가없는 'SELECT'는 행이 반환되는 순서를 보장하지 않는다는 것을 명심하십시오. 이 점을 염두에두고 * "주문과 같은 주문"*을 요구하는 것은 모호합니다. – NPE

+1

aix가 이미 지적했듯이 : (관계형) 테이블의 행에는 아무런 순서가 없습니다 **. 합의 된 순서를 보장하는 유일한 방법은'ORDER BY'를 사용하는 것입니다. –

+1

이전의 코멘트를 염두에 두십시오. 대개 특정 데이터베이스 엔진에는 일종의 정렬을 제공하는 데 사용할 수있는 일종의 "row_id"속성이 있습니다. 그러나 이전 의견은 오래 전 사실이었다. 구문은 엔진에 의존하지만. – pcalcao

답변

3

관계형 데이터베이스는 설정 이론의 한 분야를 기반으로하고 있습니다. 정보는 데이터베이스 (Set) 또는 부재 중 하나에 있습니다. 순서는 세트의 개념이 아니며, 존재 만 세트의 개념입니다. 즉, 필요한 경우 명시 적으로 모델링해야합니다.

주문을 유지 관리해야하는 경우 결과 집합 구성원을 정렬하려면 "주문 기준"절을 추가해야합니다. 때때로 그 정렬은 외부 적입니다 (그래서 당신은 질의 제출 시간까지 주문의 결정을 지연시킬 수 있습니다). 아주 드물게 "데이터 세트"에 내재 된 주문을하는 것이 중요합니다.

이상한 경우에는 내면화 된 주문이 필요합니다. 주문을 데이터와 함께 세트에 저장해야합니다. 그러나 "order by"절 (쿼리 작성자가 생략 할 수도 있음)을 적용하려면 쿼리가 항상 올바른 순서로 반환되는지 확인하기 위해 몇 가지 저장 프로 시저/데이터 뷰를 만들어야 할 수도 있습니다.

내재 된 정렬의 예는 데이터베이스에 목록을 저장할 때 일반적입니다. 일반적으로 목록 항목은 같은 행의 목록에있는 색인과 함께 저장됩니다. 이렇게하면 검색 할 때 주문 번호 을 복원 할 수 있습니다.

+0

네, 디자인 팀에 말한 바로 그게 전부입니다. :) 그러나 나는 아주 어렸을 때 100 % 확실하지 않았습니다. 그러나 오라클의 rowId를 사용하면 문제를 해결할 수 있습니다. – KaiThomasWerther

+1

특정 데이터베이스의 구현 세부 사항이므로 rowid에주의하십시오. 새로운 데이터베이스로 이식해야한다면 (궁극적으로) 비슷한 기능을 구현하는 다른 데이터베이스를 찾아서 다른 데이터베이스에서 작동하도록 코드를 다시 작성해야합니다. 다른 한편으로는, 당신이 데이터베이스 고유의 "기능"에 의존하지 않기 때문에 당신이 rowid (또는 임의의 데이터베이스 특정 기능성)를 사용하지 않고 순서대로 모델링한다면 솔루션은 모든 관계형 데이터베이스에서 작동 할 것이다. –