У меня есть таблица PostgreSQL Prices
, со столбцами:
price
(Десятичный)product_id
(Int)
Есть также created_at
и updated_at
столбцы.
Цены регулярно обновляются, и я держу старые цены в таблице. Для данного продукта последняя цена в таблице является текущей ценой.
Какой самый эффективный способ получить последнюю цену за конкретный товар:
- Индекс
product_id
и запрос для последней записи - Добавьте третий столбец
active
(Boolean), чтобы отметить последнюю цену и создать составной индекс (product_id
иactive
) - Или что-то другое?
postgresql
physical-design
Mike81
источник
источник
where active
, вероятно, поможет еще больше получить последний продукт.Ответы:
Вам понадобится индекс для product_id независимо от решения.
Если у вас есть индекс для столбца updated_at, и все, что вам нужно, это выбрать «конкретный продукт», как вы заявили, тогда я бы сделал:
Но если я не получил желаемых результатов или мне нужно было получить текущую цену для многих продуктов, то я бы попробовал добавить активный столбец и установить его равным N для всех цен, кроме новой, при выполнении обновления цен, а затем я бы создал частичный индекс, где активно, как предложено a_horse_with_no_name. Я бы пошел туда, только если бы мне было нужно, так как это добавляет уровень сложности обновления предыдущих ценовых рядов, чтобы они не были активными и т. Д.
источник
(product_id, updated_at)
или включен,(product_id, updated_at DESC)
чтобы быть эффективным. Не только на(updated_at)
.Не зная остальной части вашей базы данных, вы можете позволить себе немного нестандартную форму для ускорения получения цен на товары (при условии, что для каждого товара существует одна цена).
Просто создайте новый столбец с именем
last_price
типаprice
в вашейproduct
таблице и создайте триггерAFTER INSERT ON EACH ROW
на вашейprice
таблице. Каждый раз, когда создается новая цена, обновляется соответствующий продукт с последней ценой. Таким образом, каждый раз, когда вы получаете продукт, вы также получаете его последнюю цену.Начиная с версии 9.3, PostgreSQL поддерживает материализованные представления. Это хороший способ денормализовать данные, сохраняя нормальную форму для записи и денормализованный вид для чтения. Обновление представления может быть вызвано механизмом Postgres LISTEN / NOTIFY.
источник
Вы должны иметь столбец wef даты и времени (с эффектом от) в таблице цен. Пользователь будет вводить его значение при обновлении цены. После этого получить только значение с ограничением 1 по умолчанию.
источник