Kurz vorher: Dies ist das Backend für eine mobile App, weshalb die Frage nach der Zeitzone auftaucht.Benötige ich TIMESTAMP MIT ZEITZONE für Öffnungszeiten?
Ich kann einfach nicht meinen Kopf herumkommen. Ich habe shop_times
, die die Information von der Tageszeit bis zu einer anderen Tageszeit des Tages speichern, die ein Geschäft geöffnet hat.
Da ich will ein shop_offer
sagen können zu welchem Zeitpunkt angeboten, speichere ich auch das Intervall, das diese shop_times
war in welchem Zeitraum erzählt oder gültig ist. A shop_offer
selbst hat einen Zeitraum, in dem es gültig ist. Im Moment verwende ich TIMESTAMP WITH TIME ZONE
für alle diese Intervalle, aber ich kann nicht sagen, ob ich das wirklich brauche.
Wenn der Benutzer in London ist und die Angebote und die Zeit sehen möchte, zu der sie verfügbar sind, könnte ich ihm einfach das Datum und die Uhrzeit senden, die von einem Ladenbesitzer definiert wurden. Ich könnte dies auch als lokale Zeit anzeigen, so dass dies ist, wo ich glaube, dass nicht brauchen eine Zeitzone Informationen hier.
Auf der anderen Seite, ohne die Information Zeitzone ich nicht fragen kann „in, wie viele Stunden ist diese verfügbar“, weil z.B. 2016-03-22 08:00:00
ist nicht genug zu sagen, da der mobile Benutzer in einer anderen Zeitzone sein könnte. Aber gut, ich könnte einfach die Zeitzone in meiner shop
Einheit speichern. Schließlich bestimmt der Standort des Shops die Zeitzone. Wenn also ein mobiler Benutzer diese Frage stellt, kann ich ihm einfach die Zeitzone des Shops schicken und er kann die Antwort darauf berechnen.
Also .. sollte ich die Periodeninformation mit oder ohne Zeitzone Informationen speichern? Diese
ist, wie meine Tabellen zur Zeit wie folgt aussehen:
CREATE TABLE shop_times (
-- PRIMARY KEY
id BIGSERIAL NOT NULL,
shop_id BIGINT NOT NULL,
CONSTRAINT fk__shop_times__shop
FOREIGN KEY (shop_id)
REFERENCES shop(id),
PRIMARY KEY (id, shop_id),
-- ATTRIBUTES
valid_from_day TIMESTAMP WITH TIME ZONE NOT NULL,
valid_until_day TIMESTAMP WITH TIME ZONE NOT NULL,
time_from TIME WITHOUT TIME ZONE NOT NULL,
time_to TIME WITHOUT TIME ZONE NOT NULL,
-- CONSTRAINTS
CHECK(valid_from_day <= valid_until_day),
CHECK(time_from < time_to)
);
CREATE TABLE shop_offer_time_period (
-- PRIMARY KEY
shop_times_id BIGINT NOT NULL,
shop_offer_id BIGINT NOT NULL,
shop_id BIGINT NOT NULL,
CONSTRAINT fk__shop_offer_time_period__shop_times
FOREIGN KEY (shop_times_id, shop_id)
REFERENCES shop_times(id, shop_id),
CONSTRAINT fk__shop_offer_time_period__shop_offer
FOREIGN KEY (shop_offer_id, shop_id)
REFERENCES shop_offer(id, shop_id),
PRIMARY KEY (shop_times_id, shop_offer_id, shop_id),
-- ATTRIBUTES
valid_for_days_bitmask INT NOT NULL,
price REAL NOT NULL,
valid_from_day TIMESTAMP WITH TIME ZONE NOT NULL,
valid_until_day TIMESTAMP WITH TIME ZONE NOT NULL,
);