의견요청 : 모든 테이블에 대해 하나의 시퀀스
제가 최근에 생각하고 있는 또 다른 것이 있습니다.우리는 이전 논의에서 '자연 기본 키는 나쁘고, 인공 기본 키는 좋다'는 결론을 내렸습니다.이전에 Hibernate로 작업하면서 Hibernate 기본값이 모든 테이블에 대해 하나의 시퀀스를 생성하는 것을 보았습니다.처음에 저는 이것 때문에 어리둥절했는데, 당신은 왜 이런 일을 하십니까?하지만 나중에 저는 부모와 아이들을 연결하는 것이 바보 같은 증거가 된다는 이점을 보았습니다.기본 키 값이 동일한 테이블이 없기 때문에 실수로 부모를 자식이 아닌 테이블과 연결해도 결과가 나타나지 않습니다.
이 접근법의 단점을 아는 사람이 있습니까?하나만 보입니다. 데이터베이스에 99999999999999999999999999999999999 레코드를 초과할 수 없습니다.
단일 시퀀스에서 값을 가져오는 모든 코드에는 성능 문제가 있을 수 있습니다. 이 질문 스레드를 참조하십시오.
데이터베이스에서 시퀀스가 구현되는 방식에 따라 항상 동일한 시퀀스를 선택하는 것이 더 좋을 수도 있고 나쁠 수도 있습니다.몇 개 또는 한 개의 스레드만 새 값을 요청할 경우 잠금 문제가 발생하지 않습니다.그러나 잘못된 구현은 혼잡을 야기할 수 있습니다.
또 다른 문제는 트랜잭션 롤백입니다.다른 사용자가 이미 더 높은 값을 요청했을 수 있기 때문에 시퀀스가 롤백되지 않으므로 예상보다 훨씬 빠르게 숫자 공간을 소모할 수 있습니다.OTOH, 20억 또는 40억 개의 ID(32비트(서명된) int만 "사용하는 경우")를 먹는 데 시간이 조금 걸릴 것이므로 실제로 문제가 되는 경우는 거의 없습니다.
마지막으로, 필요하다면 시퀀스를 쉽게 재설정할 수 없습니다.그러나 다시 시작하는 시퀀스(예: 자정 이후의 레코드 수)가 필요한 경우 최대 절전 모드에서 두 번째 시퀀스를 생성/사용하도록 지시할 수 있습니다.
주요 장점은 ID만으로 DB 내 어디에서나 객체를 고유하게 식별할 수 있다는 것입니다.즉, 운영 시스템에 기록하는 로그 정보를 심각하게 줄일 수 있으며 ID만 있으면 무언가를 찾을 수 있습니다.
저는 한 테이블에 한 개의 시퀀스가 있는 것을 선호합니다.이는 다음과 같은 일반적인 관찰에서 비롯됩니다.일부 테이블("마스터 테이블")은 행 수가 상대적으로 작으므로 "영구"로 유지해야 합니다.예를 들어 ERP의 고객 테이블입니다.
다른 테이블("트랜잭션 테이블")에서는 많은 행이 영구적으로 생성되지만 일정 시간이 지나면 해당 행을 아카이브(또는 단순히 삭제)할 수 있습니다.가장 극단적인 예는 디버깅 목적으로 사용되는 추적 테이블입니다. 초당 수백 개의 행이 증가할 수 있지만 각 행은 며칠 후에 사용되지 않습니다.
마스터 테이블의 ID가 작기 때문에 디버깅 등의 목적으로 데이터베이스에서 직접 작업할 때 더 쉽게 사용할 수 있습니다.
select * from orders where customerid=415
대
select * from orders where customerid=89461836571
하지만 이것은 작은 문제일 뿐입니다.더 큰 문제는 자전거 타기입니다.모든 테이블에 대해 하나의 시퀀스를 사용하면 다시 시작할 수 없습니다.테이블당 하나의 시퀀스를 사용하여 이전 데이터를 아카이브하거나 삭제한 경우 트랜잭션 테이블의 시퀀스를 다시 시작할 수 있습니다.마스터 테이블은 훨씬 느리게 성장하기 때문에 이러한 문제가 거의 발생하지 않습니다.
모든 테이블에 대해 하나의 시퀀스만 갖는 것은 거의 가치가 없다고 생각합니다.지금까지 말한 주장들은 저를 납득시키지 못합니다.
단일 시퀀스를 사용할 경우 몇 가지 단점이 있습니다.
- 감소된 동시성다음 시퀀스 값을 배포하려면 동기화가 필요합니다.실제로, 저는 이것이 큰 문제가 될 것 같지 않다고 생각합니다.
- 단조롭게 증가하는 값을 감지하고 트리의 균형을 적절하게 맞추기 위해 btree 인덱스를 유지할 때 Oracle에는 특별한 코드가 있습니다.
- 대부분의 값이 입력된 경우 CBO는 인덱스에서 범위 쿼리를 추정하는 데 더 많은 시간을 할애할 수 있습니다(이 작업을 수행한 경우).
여러 테이블 간의 삽입 순서를 결정할 수 있다는 장점이 있을 수 있습니다.
한 테이블당 한 시퀀스 방식과 한 시퀀스 방식에는 분명 장단점이 있습니다.개인적으로 저는 행에 진정으로 고유한 식별자를 할당하여 각 ID 열을 UUID로 만들 수 있는 기능이 어떤 단점도 능가할 만큼 충분한 이점이라고 생각합니다.아론 D.는 다음과 같이 간결하게 쓰고 있습니다.
ID만으로 DB의 모든 곳에서 객체를 고유하게 식별할 수 있습니다.
또한 Hibernate3가 IMPORT 문을 배치하는 방식으로 인해 대부분의 애플리케이션에서 동일한 DB 리소스(hibernate_sequence.nextval from dual)에 대해 대량의 레코드가 경합하지 않는 한 성능 병목 현상이 발생하지 않습니다.
또한 이 시퀀스 매핑은 Grails의 최신 릴리스(1.2)에서는 지원되지 않습니다.Grails 1.1(!)에서 지원되었지만,이제 해결 방법으로 최대 절전 모드 방언 클래스 중 하나를 하위 분류해야 합니다.
Grails/GORM을 사용하는 경우 다음 JIRA 항목을 확인하십시오.
언급URL : https://stackoverflow.com/questions/1536479/asking-for-opinions-one-sequence-for-all-tables
'source' 카테고리의 다른 글
Savefig 출력 빈 이미지 (0) | 2023.07.06 |
---|---|
SQL 서버에서 저장 프로시저의 예약된 실행 (0) | 2023.07.06 |
SQL만 사용하여 기본 36에서 기본 10으로 변환 (0) | 2023.07.06 |
괄호 문자가 포함된 SQL Server LIKE (0) | 2023.07.06 |
Firebase Cloud Messaging에서 푸시 알림을 생성하지 않고 정보를 가져옵니다. (0) | 2023.07.06 |