문제

제목이 명확하지 않으면 죄송합니다. 나는 지금 설명하려고 노력할 것이다 :

나는 두 개의 표를 가지고있다 : 표 B와 표 B의 관계는 그들 사이의 관계는 하나 (테이블의 경우)와 많은 (b 표)이다. 따라서 마스터-파괴 상황과 같은 것입니다. 표 B에 분명히 소수점과 표 A의 열 '금액'열이 있습니다. 표 A의 열이 'Totalamount'열이 있습니다. 테이블 A의 값을 최신 상태로 유지하는 방법을 알아 내려고합니다. 내 제안은 테이블 B의 금액을 계산하는 집계 쿼리가있는 표 A를 기반으로 한 견해를 만드는 것입니다. 물론 적절한 색인으로 ...하지만 팀원은 무언가를 변경할 때마다 표 A의 값을 업데이트 할 것을 제안합니다. 응용 프로그램의 표 B. 여기서 가장 좋은 해결책은 무엇입니까? 세 번째 변형 일 수 있습니까?

일부 설명 ... 우리는이 테이블이 데이터베이스에서 가장 빠르게 성장하는 테이블이 될 것으로 예상했습니다. 그리고 표 B는 표 A보다 훨씬 빠르게 성장할 것입니다. 표 B에서 가장 빈번한 작업은 삽입하는 것입니다 ... 그리고 거의 다른 것은 없습니다. 표 A에서 가장 빈번한 작업은 선택입니다.

도움이 되었습니까?

해결책

여러 옵션이 있습니다.

  1. 표 B에 삽입 트리거를 사용하고 친구가 제안한대로 업데이트 테이블 A를 수행하십시오. 이렇게하면 표 B를 최신 상태로 유지합니다.
  2. X 분마다 테이블을 업데이트하는 예정된 작업을하십시오 (X = 응용 프로그램에 적합한 것은 무엇이든).
  3. 표 B를 업데이트 할 때 응용 프로그램 로직에서 표 A에 대한 업데이트를 수행하십시오. 여러 곳에서 테이블 B를 업데이트하면 작동하지 않을 수 있습니다.

다른 팁

앱에 단일 장소가있는 경우 표 B에 새 행을 삽입하는 경우 가장 간단한 솔루션은 UPDATE A set TotalAmount=TotalAmount + ? where ID = ? 방금 삽입하는 데 사용한 값을 B에 전달하십시오. 트랜잭션에서 두 쿼리 (삽입 및 업데이트)를 모두 랩핑하여 둘 다 발생하거나 없어야합니다.

간단하지 않은 경우 다음 옵션은 데이터베이스 트리거입니다. 데이터베이스의 문서를 읽는 방법을 읽으십시오. 기본적으로 트리거는 DB에서 무언가가 발생할 때 (누군가가 표 b에 데이터를 삽입 할 때) 발생할 때 실행되는 작은 코드입니다.

보기는 또 다른 옵션이지만 선택 중에는 성능 문제가 발생할 수 있으며 해결하기 어려운 선택이 발생할 수 있습니다. 대신 "구체화 된보기"또는 "계산 된 열"을 시도해보십시오 (그러나 열을 삽입/제거 할 때 성능 문제가 발생할 수 있음).

이 값이 많이 변경되면보기를 사용하는 것이 좋습니다. 확실히 더 안전한 구현입니다. 그러나 더 나은 것이 트리거를 사용하는 것입니다 (데이터베이스가 지원하는 경우).

나는 당신의 배우자가 각 삽입물의 값을 업데이트 할 것을 제안 할 것입니다. 왜냐하면 그는 당신이 값을 자주 필요로 할 것이라고 생각하고 매번 값을 속도를 느리게 할 수 있기 때문입니다. 이 경우 :

  • 데이터베이스가 캐싱을 처리해야하므로 문제가되지 않을 것입니다.
  • 그럼에도 불구하고, 나중에 해당 기능을 추가 할 수 있습니다.이 방법은 응용 프로그램이 그렇지 않으면 작동하고 많이 해당 캐시 열을 쉽게 디버깅 할 수 있습니다.

응용 프로그램 로직을 사용하여 트리거를 사용하는 것이 좋습니다. 데이터베이스가 모든 발신자에게 의존하기보다는 데이터베이스가 최신 값을 유지하도록합니다. 그러나 설계 관점에서 볼 때 생성되지 않은 데이터와 동일한 테이블에 생성 된 데이터를 저장하는 데주의를 기울일 것입니다. 명확한 분리를 유지하는 것이 중요하다고 생각하므로 사람들은 필요한 데이터 사이에 혼동되지 않습니다. 유지하고 그들을 위해 무엇을 유지할 것인지.

그러나 일반적으로 트리거를 선호하는 견해를 선호합니다. 따라서 가치를 전혀 유지하는 것에 대해 걱정할 필요가 없습니다. 성능이 문제인지 확인하기위한 프로필. Postgres에서는 계산 된 값에 대한 색인을 만들 수 있다고 생각하므로 데이터베이스는 세부 사항 테이블을 볼 필요가 없습니다.

세 번째 방법은 정기적으로 재 계산되며 트리거보다 훨씬 느리고 시야보다 느리게됩니다. 어쨌든 당신의 사용에 적합하지 않다는 것은 케이크의 착빙입니다 :).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top