2013-12-15 2 views
1

몇 가지 질문을 탐색하여 정확하게 작성해야합니다. 내 DB는 간단합니다. 나는 다른 모듈이 작동하면 논리를 망치지 않습니다.데이터베이스에서 적절한 db 제약 조건을 가진 엔티티의 최신 상태를 저장하는 방법

나는

내가 테이블 이 있고, 나는 그것의 상태를 추적 할, 수락, InProduction, 활자와 같은 책의 상태를 가질 수 BookStatus 테이블이 무엇을 가지고 , 인쇄 등이 테이블은 다음 스키마

BookStatus [bookID로서, StatusID 날짜]

날짜 필드 나 있습니다 이 상태가 종료 된 날짜를 나타내는 nullable. null 인 경우 이것이 현재 상태임을 나타냅니다. 그래서 우리는 다음과 같은 쿼리를 수행 현재 상태를 얻을 수 :

* bookID로서 = 123 및 날짜가 null *

문제

입니다 BookStatus에서 선택 * 문제는 아무런 제한 조건이 없다는 것입니다 BookID에 대해 하나 이상의 null 필드를 가질 수없는 테이블은 한 번에 하나의 상태에서만 존재할 수 있습니다. 따라서 DB와 수동 개입을 업데이트하는 응용 프로그램이 수십 가지가되는 경우 Book에 상태에 대해 null이 여러 개 있거나 언젠가 null이없는 시나리오가 있습니다.

내가 생각할 수있는 유일한 것은 내가 아니라 도서 테이블을 업데이트 상태를 업데이트 할 때마다 예약 테이블에서이 currentStatus 필드를 추가하는 것입니다

,하지만이 나던 중 내 문제를 해결 솔루션 .

상담자

  1. 현재의 접근 방식은

  2. 는 현재 시나리오에서 데이터 무결성을 보장 할 수있는 다른 방법이 있습니까 접근 충분 있는지 알고 싶어

+1

이 테이블에 대한 자연적인 PK는 {book_id, The_date}이며, 이는 the_date가 NOT NULL 가능해야합니다. 그래서 : MAX (the_date)를 사용하여 레코드를 currend 상태로 만드는 로직을 변경하거나 테이블을 상태 테이블과 별도의 status_history 테이블로 나눕니다. BTW : "날짜"는 열의 나쁜 이름입니다. 당신 아이를 "키드"라고 부르시겠습니까? – wildplasser

+0

예 최대 (날짜)는 좋지만 null 체크보다 느릴 것이라고 생각하지 않습니까? 게다가 우리가 직면하는 문제는 중복되는 상태가 아니라 여러 개의 상태 즉 null이있는 상태입니다. ([123,1, null] [123,2, null]) – shabby

+0

그럴 수도 있고 아닐 수도 있습니다. 느린; 그것은 또한 정확합니다. Whis는 정확하게 'DATE NOT NULL'을 만드는 이유입니다. – wildplasser

답변

1

현재 디자인의 경우 :
응용 프로그램이 과도하게 동시 실행되는 경우 concurrency control을 사용해야합니다.
해당하지 않으면 Lost updates이 불가피합니다. cuncurency을 제어
공지 된 방법이 될 것이다

  • 낙관적 : 트랜잭션이 어떤 테이블 컬럼 (같은 행 버전) 타임 스탬프를 부가하는 경우 검사와 같은 무결성 규칙을 만족하는지의 점검 갱신 레코드 시간 - 스탬프는 기존의 행 시간 - 스탬프와 동일합니다.
    사용자는 aborted transaction due to time-stamp mismatch으로 고통을 겪습니다.
    무거운 초국적 환경에서는 적용 할 수 없습니다.
  • 비관적 : 모든 트랜잭션에 대한 테이블 레코드 잠금과 같이 공유 리소스에 대한 액세스를 직렬화합니다.
    성능 저하 및 time out exception 발생은 부작용입니다.

새로운 디자인 : 무거운 동시 자원 (테이블)에
방지 업데이트됩니다.
BookStatus (나는 BookTransaction을 선호한다)의 디자인을 바꾸면 모든 거래가 insert DML이 될 것입니다.
거래 날짜 필드는 필수 항목입니다.
책의 마지막 상태는 마지막 거래 날짜 또는 순서를 기반으로 쿼리 또는보기에 의해 추출됩니다.

은행 지점 .Net 클라이언트, 인터넷 뱅크 J2EE 웹 서비스, 카드 스위치 C 기반 호스트와 같은 다른 플랫폼에서 시작하여 차변/대변 작업간에 공유되는 계정 잔액이 발생하면 은행 업계에서 문제가 발생했습니다 ... 두 얼굴 커밋.
우리는 모든 해결책을 시도했습니다. 새로운 디자인으로 우리를 구해 냈습니다.

아무 해결책도 부작용없이 완벽하다는 것을 유의하십시오.