2016-07-26 5 views
-1

나는 웹 사이트를 코딩하고있다. 내 질문은 다음과 같이 단순화 할 수 있습니다.SQL에서 자동으로 다른 테이블을 기반으로 한 테이블을 업데이트 하시겠습니까?

거래가 발생하여 거래 테이블에 기록 된 경우. 대차 대조표는 거래에 따라 자동으로 업데이트되어야합니다.

내가 생각할 수있는 한 가지 방법은이 트랜잭션을 기반으로 잔액 테이블이 업데이트되었는지 여부를 확인하기 위해 트랜잭션 테이블에 다른 열을 추가하는 것입니다. 사용자가 웹 사이트를 열 때마다 PHP를 사용하여 트랜잭션 테이블에서 "업데이트되지 않음"으로 표시된 항목이있는 잔액 테이블을 업데이트 한 다음 업데이트 된 잔액 테이블을 표시합니다.

하지만 사용자가 잔액을 확인하면 잔액 표가 업데이트 될 때마다이를 의미합니다.

트랜잭션 테이블을 삽입 할 때 두 테이블을 모두 업데이트하는 방식은 트랜잭션의 데이터베이스에만 액세스 할 수 있기 때문에 가능하지 않으므로 삽입 할 코드가 아닙니다.

거래 테이블을 기반으로 저울 테이블을 자동으로 업데이트 할 수있는 다른 방법이 있습니까? 트랜잭션 테이블에 업데이트가있을 때마다 서버 측에서 매 10 초마다 또는 푸시 기능을 실행할 수있는 스크립트가 있습니까? 그러면 서버가 자동으로 저울 테이블을 업데이트합니다.

미리 감사드립니다.

+0

@weeo 모든 데이터 액세스가 저장 프로 시저를 통해 발생합니까 아니면 ORM 또는 직접 테이블 액세스를 통해 발생합니까? Pls는 명확히합니다. – objectNotFound

+0

@objectNotFound 트랜잭션 테이블은 다른 데이터 세트에서 왔으며, 새로운 데이터를 동일한 트랜잭션 테이블을 가진 데이터 세트로 푸싱합니다. 그래서 업데이트 된 트랜잭션 테이블을 기반으로 저울 테이블을 업데이트해야합니다. 그래서 나는 내 테이블에 대해 무엇이든 할 수 있습니다. 그러나 트랜잭션 테이블은 다른 데이터베이스의 푸시 기능을 통해 업데이트됩니다. – weeo

+0

당신이 말한 것에서는 외부 푸시 메커니즘을 변경하지 않고 트랜잭션 테이블 스키마를 변경할 수 없다고 말합니다. 저장 프로 시저 및 뷰를 통해 테이블에 액세스하지 않는 한. SP를 통해 삽입이 이루어지면 상황을 쉽게 처리 할 수 ​​있습니다. – objectNotFound

답변

3

첫 번째 질문은 균형 테이블을 원하십니까? 트랜잭션에서 잔액을 얻을 수 있다면 뷰가 충분할 수도 있습니다. 항상 최신 상태로 유지되며 트랜잭션 처리에 오버 헤드 나 복잡성을 부과하지 않습니다.

테이블에서 파생 잔액을 캐시하려는 경우 - 트랜잭션이 추가되는 것보다 더 많이 볼 수 있기 때문에 아마도 콜드 스타트에서 수행 할 수 있어야합니다. 트랜잭션이 도착할 때만 균형을 생성 할 수있는 위치에 있기를 원하지 않습니다. 무언가가 잘못되었을 때 - 일 때 일 때 - 당신은 "긴급 코드"를 쓰는 것을 멈출 것입니다. 차라리 저녁을 먹을거야. 따라서 균형 생성을 트랜잭션 처리에 의존하지 마십시오. 여기

내가 그것을 할 것입니다 방법은 다음과 같습니다

  • 가 균형 뷰를 작성합니다.
  • 보기와 동일하지만 last_transaction_timebalances 테이블을 만듭니다.

이제 다음을 수행하는 SQL 프로 시저가 필요합니다

  1. max(transactions.time)max(balances. last_transaction_time) 비교.
  2. balances이 오래된 경우보기에서 업데이트하십시오.
  3. select ... from balances (표).

단점은 새로운 거래가 게시 된 후에 사용자가 잔액을 다시 생성 할 때까지 기다려야한다는 것입니다. 단점은 모든 거래가 끝난 후에 필요한 경우에만 잔액이 생성된다는 것입니다. 거래 처리는 종종 시간에 민감하기 때문에 대개 매우 중요합니다.

처리 트랜잭션과 계산 잔액 사이에는 항상 일부 시간이 있습니다. 저울 캐싱의 유용성은 사용 빈도와 계산 복잡성의 함수입니다.

위의 프로세스는 항상 정확한 잔액을 산출하고 계산 수를 최소화합니다. 느린 시간에 만료 된 캐시를 "사전 계산"하도록 수정할 수 있습니다. 이는 피크 시간 처리량과 교환하여 오프 피크 (off-peak) 오버 헤드가 발생하는 선택입니다.

+0

+1 '에 대한 +1은 잔액이 필요한 때만 생성되며 모든 거래가 끝난 후에 생성되지 않습니다.'먼저 잔액 테이블을 갖는 점은 누군가에게 현재 잔액을 표시하는 것이며 아무도 요청하지 않으면 왜 계산합니까? 그것? –

+0

답장을 보내 주셔서 감사합니다. 균형 테이블을 가지지 않고 트랜잭션 테이블에서 매번 잔액을 계산하는 것에 대해서도 생각하고 있습니다. 하지만 거래 테이블이 매우 커질 수 있습니다. 그래서 나는 균형을 유지하는 것이 공정 속도를 높이는 것이 좋을 것이라고 생각합니다 ... 상세한 계획을 가져 주셔서 감사합니다. 나는이 길로 갈 것이다! – weeo

관련 문제