몇 가지 질문을 탐색하여 정확하게 작성해야합니다. 내 DB는 간단합니다. 나는 다른 모듈이 작동하면 논리를 망치지 않습니다.데이터베이스에서 적절한 db 제약 조건을 가진 엔티티의 최신 상태를 저장하는 방법
나는
내가 테이블 책이 있고, 나는 그것의 상태를 추적 할, 수락, InProduction, 활자와 같은 책의 상태를 가질 수 BookStatus 테이블이 무엇을 가지고 , 인쇄 등이 테이블은 다음 스키마
BookStatus [bookID로서, StatusID 날짜]
날짜 필드 나 있습니다 이 상태가 종료 된 날짜를 나타내는 nullable. null 인 경우 이것이 현재 상태임을 나타냅니다. 그래서 우리는 다음과 같은 쿼리를 수행 현재 상태를 얻을 수 :
* bookID로서 = 123 및 날짜가 null *
문제
입니다 BookStatus에서 선택 * 문제는 아무런 제한 조건이 없다는 것입니다 BookID에 대해 하나 이상의 null 필드를 가질 수없는 테이블은 한 번에 하나의 상태에서만 존재할 수 있습니다. 따라서 DB와 수동 개입을 업데이트하는 응용 프로그램이 수십 가지가되는 경우 Book에 상태에 대해 null이 여러 개 있거나 언젠가 null이없는 시나리오가 있습니다.
내가 생각할 수있는 유일한 것은 내가 아니라 도서 테이블을 업데이트 상태를 업데이트 할 때마다 예약 테이블에서이 currentStatus 필드를 추가하는 것입니다
,하지만이 나던 중 내 문제를 해결 솔루션 .
상담자
현재의 접근 방식은
는 현재 시나리오에서 데이터 무결성을 보장 할 수있는 다른 방법이 있습니까 접근 충분 있는지 알고 싶어
이 테이블에 대한 자연적인 PK는 {book_id, The_date}이며, 이는 the_date가 NOT NULL 가능해야합니다. 그래서 : MAX (the_date)를 사용하여 레코드를 currend 상태로 만드는 로직을 변경하거나 테이블을 상태 테이블과 별도의 status_history 테이블로 나눕니다. BTW : "날짜"는 열의 나쁜 이름입니다. 당신 아이를 "키드"라고 부르시겠습니까? – wildplasser
예 최대 (날짜)는 좋지만 null 체크보다 느릴 것이라고 생각하지 않습니까? 게다가 우리가 직면하는 문제는 중복되는 상태가 아니라 여러 개의 상태 즉 null이있는 상태입니다. ([123,1, null] [123,2, null]) – shabby
그럴 수도 있고 아닐 수도 있습니다. 느린; 그것은 또한 정확합니다. Whis는 정확하게 'DATE NOT NULL'을 만드는 이유입니다. – wildplasser