![]() |
Aufbau einer Währungstabelle
Tach Zusammen,
weiss grad nicht wo das Tehma hingehört, vielleicht hier oder in den Bereich der Datenbanken. Aber ich versuche es mal hier :oops: Wollte ganz gerne in SQLite eine Währungstabelle anlegen, mit folgenden Aufbau: {@Datum;@Kurstyp;@Währung_Von;@Währung_Nach;Kurs}Jetzt wollte ich gerne performant und auch häufig die Tabelle abfragen. Dabei tritt das Problem auf, dass ich nicht weiss wann der letzte Eintrag in der Tabelle vorhanden ist. Daher die Frage an Euch, wie würdet ihr so eine Abfrage/Tabellendesign am besten gestallten, dass man auch bei vielen Einträgen mit möglichst geringen Kosten auskommt und der gültige Datensatz zuverlässig geliefert wird? Schon mal vielen Dank für die Tipps DSP |
AW: Aufbau einer Währungstabelle
Wer trägt denn die Daten in die Tabelle ein? Doch wohl die gleiche Anwendung.
Generell würde ich hier den gesamten Verhau grundsätzlich lösen. Einen Wert-Typ für die Währung Einen Wert-Typ für die Umrechnung Einen Wert-Typ für den Währungsbetrag Ein Repository für die Werte Einen Umrechner der einem Währungsbetrag in eine andere Währung umrechnen kann Ein Repository wird immer als Interface ausgelegt, dadurch kann man sehr schön auch einen Proxy/Cache dazwischenschalten, der hier in diesem Fall z.B. die Werte zwischenspeichert, so dass für jeden Wert nur eine Abfrage an die Datenbank geht und alle weiteren werden aus dem Cache bedient. Wenn ich etwas Zeit finde, kann ich da mal ein Konstrukt zusammenbauen |
AW: Aufbau einer Währungstabelle
Zitat:
|
AW: Aufbau einer Währungstabelle
Hallo Zusammen,
danke für die Hilfe, das Hauptproblem das sich für mich darstellt, wie kann man am effizientesten auf den aktuellen Datensatz zugreifen, wenn man den Schlüssel nicht kennt? Dazu kommt noch, dass das Rücklesen auch nicht besonderes gut ist, da es ggf auch zuvor keine Datensätze gibt. Der Anwender kann zur Umrechnung prinzipiell jedes mögliche Datum eingeben. Hier ist eben die Frage, wie man das am effizientesten lösen kann. Schon mal vielen Dank DSP |
AW: Aufbau einer Währungstabelle
Welche Felder haben denn einen Index ?
ggf auf die Typisch abgefragten Felder einen Index anlegen |
AW: Aufbau einer Währungstabelle
Zitat:
Den zuletzt eingegebenen, weil es doch nur um aktuelle Wechselkurse geht? Oder doch quer Beet ("der anwender kann ..jedes mögliche Datum eingeben..")? Also ich vermute nochmal, dass ggF. Werte historisiert vorliegen und dass das abgefragte Datum bzw. der Kurs zu dieser Zeit exakt so wie abgefragt bestenfalls zufällig vorhanden ist. Mglw. wäre hier ein Ansatz:
Code:
Jenachdem ob was rauskommt oder nicht, muss noch geprüft werden, ob nur eine Bedingung erfüllt ist (möglicher Treffer ganz am Anfang oder Ende)
select * from wechselkurshistorie
where ..siehe unten bei DeddyH Weiter muss eingeschränkt werden, welche beiden Währungen den Kurs definieren (2 Fremdschlüssel?, also 2 weitere Einschränkungen im where bzw.Joins) Was meinst Du mit Rücklesen? |
AW: Aufbau einer Währungstabelle
Ich hätte eher so gedacht (ungetestet):
SQL-Code:
SELECT
* FROM wechselkurse WHERE Datum = ( SELECT MAX(Datum) FROM wechselkurse WHERE Datum <= :Abfragedatum ) |
AW: Aufbau einer Währungstabelle
Zitat:
|
AW: Aufbau einer Währungstabelle
Mach Dir nichts draus, sowas passiert mir auch öfter :)
|
AW: Aufbau einer Währungstabelle
Mein Vorschlag dazu wäre
SQL-Code:
DROP TABLE IF EXISTS "currency_rates";
DROP TABLE IF EXISTS "currencies"; -- Stammdaten Währungen CREATE TABLE "currencies" ( "ISOCODE" VARCHAR(3) NOT NULL, "ISONUM" int(3) NOT NULL, "ISONUMdate" date NOT NULL, "Name" text, "Format" text, PRIMARY KEY("ISOCODE") ); CREATE INDEX "idx_currencies_ISONUM" ON currencies (ISONUM, ISONUMdate); CREATE UNIQUE INDEX "idx_currencies_ISONUMCODE" ON currencies (ISONUM, ISONUMdate, ISOCODE); -- Währungs-Daten INSERT INTO "currencies" ( "ISOCODE", "ISONUM", "ISONUMdate", "Name", "Format" ) VALUES ( 'EUR', 978, '1990-01-01', 'Euro', '%f €' ); INSERT INTO "currencies" ( "ISOCODE", "ISONUM", "ISONUMdate", "Name", "Format" ) VALUES ( 'USD', 840, '1990-01-01', 'Dollar', '$ %f' ); -- Besonderheiten bei der Belegung der ISONUM Werte INSERT INTO "currencies" ( "ISOCODE", "ISONUM", "ISONUMdate", "Name", "Format" ) VALUES ( 'BUK', 104, '1952-07-01', 'Burma Kyat', '%f BUK' ); INSERT INTO "currencies" ( "ISOCODE", "ISONUM", "ISONUMdate", "Name", "Format" ) VALUES ( 'MMK', 104, '1990-02-01', 'Myanmar Kyat', '%f MMK' ); INSERT INTO "currencies" ( "ISOCODE", "ISONUM", "ISONUMdate", "Name", "Format" ) VALUES ( 'SUR', 810, '1923-01-01', 'Sowjetischer Rubel', '%f SUR' ); INSERT INTO "currencies" ( "ISOCODE", "ISONUM", "ISONUMdate", "Name", "Format" ) VALUES ( 'RUR', 810, '1991-01-01', 'Russicher Rubel', '%f RUR' ); INSERT INTO "currencies" ( "ISOCODE", "ISONUM", "ISONUMdate", "Name", "Format" ) VALUES ( 'RUB', 643, '1998-01-01', 'Neuer Russischer Rubel', '%f RUB' ); -- Wechselkurse CREATE TABLE "currency_rates" ( "sourceISOCODE" varchar(3) NOT NULL, "destinationISOCODE" varchar(3) NOT NULL, "ratetype" varchar(3) NOT NULL, "ratedate" "date" NOT NULL, "rate" real NOT NULL, PRIMARY KEY("sourceISOCODE","destinationISOCODE","ratetype","ratedate"), CONSTRAINT "fk_source_currency" FOREIGN KEY ("sourceISOCODE") REFERENCES "currencies" ("ISOCODE") ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT "fk_destination_currency" FOREIGN KEY ("destinationISOCODE") REFERENCES "currencies" ("ISOCODE") ON DELETE CASCADE ON UPDATE CASCADE ); -- Daten Wechselkurse INSERT INTO "currency_rates" ("sourceISOCODE", "destinationISOCODE", "ratetype", "ratedate", "rate") VALUES ( "EUR", "USD", "AWK", date('2015-01-01'), 1.11 ); INSERT INTO "currency_rates" ("sourceISOCODE", "destinationISOCODE", "ratetype", "ratedate", "rate") VALUES ( "EUR", "USD", "AWK", date('2015-01-02'), 1.12 ); INSERT INTO "currency_rates" ("sourceISOCODE", "destinationISOCODE", "ratetype", "ratedate", "rate") VALUES ( "EUR", "USD", "AWK", date('2015-01-03'), 1.13 ); INSERT INTO "currency_rates" ("sourceISOCODE", "destinationISOCODE", "ratetype", "ratedate", "rate") VALUES ( "EUR", "USD", "AWK", date('2015-01-04'), 1.14 ); INSERT INTO "currency_rates" ("sourceISOCODE", "destinationISOCODE", "ratetype", "ratedate", "rate") VALUES ( "EUR", "USD", "AWK", date('2015-01-05'), 1.15 ); INSERT INTO "currency_rates" ("sourceISOCODE", "destinationISOCODE", "ratetype", "ratedate", "rate") VALUES ( "EUR", "USD", "AWK", date('2015-01-06'), 1.16 ); INSERT INTO "currency_rates" ("sourceISOCODE", "destinationISOCODE", "ratetype", "ratedate", "rate") VALUES ( "EUR", "USD", "AWK", date('2015-01-07'), 1.17 ); -- Abfrage eines konkreten Wechselkurs SELECT * FROM currency_rates WHERE sourceISOCODE = 'EUR' AND destinationISOCODE = 'USD' AND ratetype = 'AWK' AND ratedate <= date( '2015-01-03' ) ORDER BY ratedate DESC LIMIT 1; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz