2011-03-19 5 views
3

데이터베이스에 내역을 저장하는 것과 관련하여 DateEnd (예 1) 또는 Duration (예 2)을 사용하는 것이 더 낫습니까?데이터베이스에 내역 저장

또는 가장 효과적인 다른 방법을 제안해도 좋습니다.

올바른 접근 방법 인 것으로 판명되면이 예제 중 하나를 다른 변경해야합니까? 사용중인 DB는 MySQL이지만, 여기 접근법에 영향을 미치지 않는다고 생각합니다. 기간에 반대

enter image description here

답변

1

두 가지 관점이 있습니다. 첫째, 비즈니스 도메인이란 무엇입니까? 귀하의 예에서는 "구독"을 사용했습니다. 이들은 "매월", "주간"등으로 판매되는 경우가 많습니다. 다른 모든 것들은 평등하므로 가능한 경우 비즈니스 개념에 맞게 데이터베이스를 선호합니다. "subscription_type"테이블을 작성하고 해당 유형에서 설명의 지속 시간을 파생시킬 수도 있습니다.

종종 데이터베이스가 수행해야 할 필요성과 충돌합니다. 그런 관점에서 볼 때 가장 일반적인 쿼리가 어떻게 될지 생각해보고 최소한의 유형 변환 또는 계산이 가능한 데이터베이스 디자인을 만들 수 있는지 확인하십시오. 예를 들어, 구독 날짜가 지정된 날짜에 만료되는 모든 레코드를 찾는 것은 시작 날짜에 기간을 추가하여 날짜를 계산하는 것이 아니라 dateEnd < targetDate를 요청할 수있는 경우 훨씬 쉽고 빠를 수 있습니다.

+0

이제 조금 더 생각하게되었습니다. 사물을 조사하고 SubscriptionType 테이블이 내 요구를 충족시킬 수 있는지 확인해야합니다."종종 데이터베이스를 수행해야하는 필요성에 부딪히는 경우가 있습니다."라는 질문은 첫 단락에 대한 응답으로 어쩌면 그렇게하지 않아도 될까요? 여기서 중요한 것은 종료 날짜를 추적하여 사용자가 다시 확인해야하는시기를 알리는 것입니다. 30 일 (증분/s) 통지와 같은 것 및 액세스 제한을 위해 만료 된 계정을 추적합니다. 물론 다른 내부적 인 질의가 행해지 겠지만 동일한 기본 개념을 염두에 두어야합니다. – swisscheese

+0

예, 성능 우려는 비즈니스 도메인을 모델링하려는 욕구와 종종 충돌합니다. 귀하의 경우, 수백만 명의 가입자가 없으면 큰 문제는 아니라고 생각합니다. 리마인더 등을 만들려면 리마인더 테이블에 리포터를 배치하는 것이 좋습니다. 상태에 따라 해당 리시버가 작동하는지 여부를 추적 할 수 있습니다. 필요한 경우 리마인더를 추적하고 알릴 수도 있습니다. 사람들이 반응 할 가능성이 높은 날 (주말은 평일보다 나쁠 수 있음)에 보내십시오. –

0

나는 종료 날짜를 저장하는 것입니다. 필요한 경우 지속 시간을 계산할 수 있습니다. 측정 대신에 측정 포인트를 저장하는 것이 더 의미가있는 것처럼 보입니다.

+0

기간을 사용하면 실제로 정보가 손실됩니다. 측정 지점에서 측정 지점으로 이동하는 것이 가능하지만 대개 측정에서 측정 지점을 다시 만들 수 없습니다. –

0

기간과 같은 파생 값을 데이터베이스에 저장할 필요가 없습니다.

행의 히스토리를 캡처하는 접근 방식은 일부 경우 작동하지만 실제로 모든 행의 모든 ​​변경 사항을 catch하려면 테이블의 삽입 및 업데이트시 트리거에 의해 업데이트 될 subscription_hist와 같은 다른 테이블이 필요할 것입니다. 신청. 그런 다음 last_modified_date 및 last_person_changed_by 만 추적해야합니다. 다른 모든 것은 파생 될 수 있습니다. 이렇게하면 시간이 지남에 따라 행에 어떤 변화가 있었는지 확인할 수 있습니다. 명확하게 설명 할 그림이 없지만이 방법을 신중하게 구현하면 과거의 정보를 유지하는 것뿐만 아니라 데이터의 전체 시점 복구가 가능합니다.

+0

subscription_hist와 같은 또 다른 기능을 소개하면 데이터베이스에 복제본을 작성하는 것이 아니라고 말할 수 있습니까? 아니면 금융 시스템에서 거래 테이블로 뭔가를 제안하고 있습니까? – swisscheese

1

시작일과 종료일이있는 경우 언제든지 기간을 계산할 수 있어야합니다. 시작일과 기간이있는 경우 언제든지 종료일을 계산할 수 있어야합니다 (또는 항상 수 있어야합니다).

"불일치"할 수없는 효과를 모두 기록하고 행 제약 조건을 적용 할 수도 있습니다.

그러나 "종료일"데이터의 사용 빈도가 매우 높은 것은 "현재가 아님"행을 필터링하는 것입니다. WHERE END_DATE> CURRENTSYSTEMDATE()와 같습니다. 그런 종류의 사용법이 있다면 종료일을 "제외"하는 것은 좋지 않습니다.