제품 목록이 있습니다. 이들 각각은 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을 사용하는 경우 내가 사용하는 방법보다 더 나은 방법이 있습니까?
답변
시간에 따라 달라지는 항목 (예 : “D 날짜의 X 가격은 얼마입니까”또는 “E 날짜의 젖소 Q에있는 젖소는 어떤지”과 같은 질문에 대답 할 수 있음)은 “시간 중심 개발”책을 읽는 것이 좋습니다. SQL의 데이터베이스 응용 프로그램 ” 이 책은 인쇄되지 않았지만 저자는 자신의 웹 사이트에서 책의 PDF와 관련 CD를 자비 롭게 제공했습니다.
http://www.cs.arizona.edu/~rts/publications.html(“books “에서 첫 번째 항목을 찾으십시오).
온라인 간략한 소개는 다음을 참조하십시오.
답변
확실히 유효 날짜를 데이터베이스에 저장했습니다. 결국 사람들은 시간이 지남에 따라 가격이 어떻게 변했는지 확인하거나 과거 제품 가격표와 비교하여 주문의 이상을 교차 확인하기 위해 쿼리를 실행할 수 있기를 원할 것입니다. 실행중인 쿼리 유형과 가격 변동 빈도에 따라 현재 가격과 과거 가격에 대한 별도의 테이블을 갖는 것이 좋습니다.
가격을 저장하는 대부분의 시스템에서 유효 날짜와 함께 만료 날짜 열을 사용하여 현재 유효한 가격을 쉽게 결정할 수 있습니다. 특정 시점에서 어떤 가격이 유효한지 나는 당신의 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
.
답변
문제 설명을 올바르게 이해하면 생성 데이터를 처리 할 수있는 방법이 필요합니다 (예 : 테이블에는 각 날짜가 민감한 각 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}입니다.