유효 날짜가있는 가격을 저장하는 방법은 무엇입니까?


21

제품 목록이 있습니다. 이들 각각은 N 개의 공급자가 제공합니다.

각 제공자는 특정 날짜에 대한 가격을 알려줍니다. 해당 가격은 해당 제공자가 새로운 가격을 정할 때까지 유효합니다. 이 경우 공급자는 새로운 날짜로 새로운 가격을 제공합니다.

MySQL 테이블 헤더는 현재 다음과 같습니다.

provider_id, product_id, price, date_price_effective

격일로, 우리는 현재 날짜에 효과적인 제품 / 가격 목록을 작성합니다. 각 제품의 목록에는 해당 특정 제품이있는 공급자의 정렬 된 목록이 포함됩니다. 그런 식으로, 우리는 최고의 가격을 제공하는 사람으로부터 특정 제품을 주문할 수 있습니다.

효과적인 가격을 얻으려면가있는 모든 행을 반환하는 SQL 문이 있습니다 date_price_effective >= NOW(). 이 결과 세트는 다음과 같은 파일을 얻는 데 필요한 정렬 및 필터링을 수행하는 루비 스크립트로 처리됩니다.

product_id_1,provider_1,provider_3,provider8,provider_10...
product_id_2,provider_3,provider_2,provider1,provider_10...

이것은 우리의 목적을 위해 잘 작동하지만 여전히 SQL 테이블이 이러한 종류의 정보를 저장하는 가장 좋은 방법은 아니라는 가려움이 있습니다. 나는 이런 종류의 문제가 다른 창조적 인 방법으로 이전에 해결되었다는 느낌을 가지고있다.

이 정보를 SQL 이외의 다른 방법으로 저장하는 더 좋은 방법이 있습니까? 또는 SQL을 사용하는 경우 내가 사용하는 방법보다 더 나은 방법이 있습니까?


lal00 : 내 의견 중 하나에서 언급했듯이 효과적인 데이트는 정기적으로 처리합니다. 간단한 효과적인 날짜 처리 방법은 내 답변을 참조하십시오. 새 가격 행을 만들 때 가격이 유효한 기간을 알 필요가 없으며 새 행을 만들 때 가장 최근의 최신 행을 다시 되돌릴 필요도 없습니다.
bit-twiddler

답변:


17

시간에 따라 달라지는 항목 (예 : "D 날짜의 X 가격은 얼마입니까"또는 "E 날짜의 젖소 Q에있는 젖소는 어떤지"과 같은 질문에 대답 할 수 있음)은 "시간 중심 개발"책을 읽는 것이 좋습니다. SQL의 데이터베이스 응용 프로그램 " 이 책은 인쇄되지 않았지만 저자는 자신의 웹 사이트에서 책의 PDF와 관련 CD를 자비 롭게 제공했습니다.

http://www.cs.arizona.edu/~rts/publications.html("books "에서 첫 번째 항목을 찾으십시오).

온라인 간략한 소개는 다음을 참조하십시오.


1
글쎄, 이것은 내가 물었을 때 내가 생각했던 것이 아니라, 더 낫다! :)
edmz

3

확실히 유효 날짜를 데이터베이스에 저장했습니다. 결국 사람들은 시간이 지남에 따라 가격이 어떻게 변했는지 확인하거나 과거 제품 가격표와 비교하여 주문의 이상을 교차 확인하기 위해 쿼리를 실행할 수 있기를 원할 것입니다. 실행중인 쿼리 유형과 가격 변동 빈도에 따라 현재 가격과 과거 가격에 대한 별도의 테이블을 갖는 것이 좋습니다.

가격을 저장하는 대부분의 시스템에서 유효 날짜와 함께 만료 날짜 열을 사용하여 현재 유효한 가격을 쉽게 결정할 수 있습니다. 특정 시점에서 어떤 가격이 유효한지 나는 당신의 NOW() >= date_price_effective상태가 무엇인지에 대해 확실하지 않습니다. 아마도 그것은 현재 가격과 이전의 모든 역사적 가격을 반환합니다. "유효 가격"은 다음과 같이 정의 된 현재 가격이 될 것이라고 생각합니다.NOW() BETWEEN date_price_effective AND date_price_expired

또한 파일의 모양이 확실하지 않습니다. 그것은 무엇을 나에게 분명하지 않다 provider_1? 또는 공급자 data--을 주문하고 어떻게하는 이유는 무엇입니까 - provider_id = 1 개 가격 represents-- provider_1첫번째에 대한 표시 product_id_1와에 대한 세 번째 product_id_2.


저스틴, 만료일이 의미가 있습니다. 네 말이 맞아, 나는 다른 방법으로 SQL을 가지고 있었다. 출력 파일은 내 질문과 관련이 없으며 가격으로 제품을 정렬해야한다는 것을 보여주는 방법으로 추가했습니다.
edmz

일반적으로 행을 만들 때 가격이 유효한 기간이 주어지지 않기 때문에 추가 오버 헤드 만 추가하기 때문에 각 행에 만료 날짜를 포함 할 필요는 없습니다. 테이블에 각 producer_id / product_id 쌍에 대해 N 개의 행이 있고 각 날짜가 특정 날짜에 유효하면 주어진 날짜보다 작거나 같은 가장 큰 date_price_effective 값을 가진 행이 적용되는 가격입니다. 그 날짜. 내 게시물을 보면이 유형의 쿼리를 수행하는 SQL 코드가 표시됩니다. 정기적으로 유효 날짜를 처리해야합니다.
bit-twiddler

@ bit-twiddler-확실히 만료 날짜가 필요하지 않습니다. 그러나 만료 날짜가 있으면 일반적으로 테이블 쿼리가 훨씬 쉽고 효율적입니다. 효과적인 날짜 쿼리는 일반적으로 가격 변동보다 훨씬 흔하기 때문에 일반적으로 기꺼이 절충합니다.
Justin Cave

3

문제 설명을 올바르게 이해하면 생성 데이터를 처리 할 수있는 방법이 필요합니다 (예 : 테이블에는 각 날짜가 민감한 각 provider_id / product_id 쌍에 대해 여러 행이 포함됨). 이 경우 date_price_effective 값이 오늘보다 작거나 같은 제품의 최신 가격을 찾고 있습니다. 이러한 유형의 상황은 SQL 부속 선택을 사용하여 쉽게 처리 할 수 ​​있습니다.

 SELECT 
   provider_id, product_id, price, date_price_effective 
 FROM 
   price_table a 
 WHERE 
   date_price_effective = 
     (
       SELECT 
         MAX(date_price_effective) 
       FROM 
         price_table b 
       WHERE 
         b.provider_id = a.provider_id AND 
         b.product_id = a.product_id AND
         b.date_price_effective <= NOW() 
     );

가격은 쿼리가 실행 된 날짜보다 작거나 같은 가장 큰 date_price_effective 값을 갖는 한 유효합니다. 오늘보다 큰 date_price_effective 값은 미래의 유효 날짜입니다. 위에 나열된 코드는 날짜가 가장 가깝지만 쿼리 실행 날짜보다 늦지 않은 date_price_effective 값을 갖는 각 provider_id / product_id 쌍에 대한 행 데이터를 리턴합니다. 이 솔루션은 가격을 유효 기간으로 자동 괄호로 묶습니다. 이 테이블의 기본 키는 트리플 {provider_id, product_id, date_price_effective}입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.