Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Kontynuacja:jak modelować rabaty na pozycje w bazie danych?

Projekt ProductPricing tabela pozwala nam nigdy nie usuwać starych danych cenowych (czasami kierownictwo chce raportu opartego na tych danych). Z tym, co opisałeś powyżej, zacząłbyś w ten sposób (zmieniłem datę rozpoczęcia, aby łatwo zauważyć, że tak, to była pierwotna cena, gdy system został wprowadzony):

ProductPricing
   1   |    Jan 1, 1970, 00:00:00 |   Jan 1, 2038, 00:00:00  |   10$ |   10$

Załóżmy teraz, że dajesz zniżkę na swoje jabłka i chcesz działać proaktywnie i skonfigurować system na koniec wyprzedaży:

ProductPricing
   1   |    Jan 1, 1970, 00:00:00 |  Dec 20, 2011, 00:00:00  |   10$ |   10$
   1   |   Dec 20, 2011, 00:00:01 |  Dec 26, 2011, 00:00:00  |  7.5$ |   10$
   1   |   Dec 26, 2011, 00:00:01 |   Jan 1, 2038, 00:00:00  |   10$ |   10$

To, co tutaj zrobiliśmy, to:

  1. Zaktualizuj istniejący rekord sygnaturą czasową 2038, zmieniając endDateTimeStamp pole odzwierciedlające początek wyprzedaży
  2. Wstaw nowy rekord, aby zdefiniować sprzedaż
  3. Wstaw kolejny nowy rekord, aby ponownie odzwierciedlić normalną cenę

Bez nakładających się sygnatur czasowych masz gwarancję uzyskania jednego rekordu, gdy zapytasz bazę danych o swoją cenę. Tak więc

SELECT p.Name, pp.price, pp.original_price
FROM Product p
INNER JOIN ProductPricing pp ON pp.productId = p.productId
WHERE NOW() BETWEEN pp.startDateTimeStamp AND pp.endDateTimeStamp

otrzymasz listę produktów z aktualnymi cenami.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL ORDER BY DESC jest szybki, ale ASC bardzo wolny

  2. Korzystanie z Order By w kodzie zapalającym

  3. Kod błędu:1136 Liczba kolumn nie odpowiada liczbie wartości w wierszu 1) wewnątrz sp

  4. MySQL — Model listy sąsiedztwa — Uzyskaj głębię

  5. Jak za pomocą SQL przekształcić dane pionowe w dane poziome?