Mam tabelę PostgreSQL Prices
z kolumnami:
price
(Dziesiętny)product_id
(Int)
Istnieją również created_at
i updated_at
kolumny.
Ceny są regularnie aktualizowane i trzymam stare ceny w tabeli. Dla danego produktu ostatnia cena w tabeli jest ceną bieżącą.
Jaki jest najbardziej efektywny sposób uzyskania ostatniej ceny za konkretny produkt:
- Indeks
product_id
i zapytanie dotyczące ostatniego rekordu - Dodaj trzecią kolumnę
active
(wartość logiczna), aby zaznaczyć najnowszą cenę i utworzyć indeks złożony (product_id
iactive
) - Albo coś innego?
postgresql
physical-design
Mike81
źródło
źródło
where active
prawdopodobnie jeszcze bardziej pomogłoby uzyskać najnowszy produkt.Odpowiedzi:
Będziesz potrzebował indeksu na id_produktu niezależnie od rozwiązania.
Pod warunkiem, że masz indeks w kolumnie updated_at, a wszystko, czego potrzebujesz, to pobrać „określony produkt”, jak powiedziałeś, to zrobiłbym:
Ale jeśli nie uzyskałem oczekiwanych rezultatów lub gdybym musiał uzyskać bieżącą cenę dla wielu produktów, wówczas spróbowałbym dodać opcję aktywnej kolumny i ustawić ją na N dla wszystkich cen innych niż nowa, robiąc to aktualizacje cen, a następnie utworzyłbym częściowy indeks, w którym byłby aktywny, jak sugeruje a_horse_w_no_name. Wybrałbym się tam tylko, gdybym tego potrzebował, ponieważ dodaje to warstwy złożoności aktualizacji poprzednich wierszy cen, aby nie były aktywne itp.
źródło
(product_id, updated_at)
lub włączenia,(product_id, updated_at DESC)
aby było wydajne. Nie tylko na(updated_at)
.Bez znajomości reszty bazy danych możesz sobie pozwolić na nieco niestandardową formę, aby przyspieszyć pobieranie cen produktów (zakładając, że za każdą pozycję przypada jedna cena).
Wystarczy utworzyć nową tabelę
last_price
o nazwie typprice
wproduct
tabeli i utworzyć wyzwalaczAFTER INSERT ON EACH ROW
wprice
tabeli. Za każdym razem, gdy tworzona jest nowa cena, aktualizuje powiązany produkt o najnowszą cenę. W ten sposób za każdym razem, gdy pobierasz produkt, pobierasz również jego ostatnią cenę.Od wersji 9.3 PostgreSQL obsługuje zmaterializowane widoki. To dobry sposób na zdenormalizowanie danych, zachowanie normalnej formy do pisania i zdormalizowany widok do odczytu. Aktualizacja widoku może zostać uruchomiona przez mechanizm LISTEN / NOTIFY Postgresa.
źródło
Powinieneś mieć kolumnę daty i godziny WEF (ze skutkiem od) w tabeli cen. Użytkownik wprowadzi jego wartość podczas aktualizacji ceny. Następnie pobierz tylko wartość z desc wef limit 1.
źródło