AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Aufbau einer Währungstabelle

Ein Thema von DSP · begonnen am 20. Jan 2015 · letzter Beitrag vom 25. Jan 2015
Antwort Antwort
Seite 1 von 2  1 2      
DSP

Registriert seit: 10. Jul 2014
49 Beiträge
 
#1

Aufbau einer Währungstabelle

  Alt 20. Jan 2015, 17:32
Tach Zusammen,

weiss grad nicht wo das Tehma hingehört, vielleicht hier oder in den Bereich der Datenbanken. Aber ich versuche es mal hier

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
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Aufbau einer Währungstabelle

  Alt 20. Jan 2015, 18:13
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#3

AW: Aufbau einer Währungstabelle

  Alt 21. Jan 2015, 07:36
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
Wenn ich die Anforderung richtig geahnt hab, ist hier noch das Datum im Spiel, also historisierte Daten, also Kursverläufe. Es wäre also ein gegebenes Eintragsdatum zu berücksichtigen und bei der Abfrage eine Vorschrift, die aus dem gewünschten Zeitpunkt und den nächsten vorhandenen Werten in der Historie einen definierten Wert ausspuckt (nächster, voriger, Mittelwert daraus, ...)
Gruß, Jo
  Mit Zitat antworten Zitat
DSP

Registriert seit: 10. Jul 2014
49 Beiträge
 
#4

AW: Aufbau einer Währungstabelle

  Alt 21. Jan 2015, 08:51
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
  Mit Zitat antworten Zitat
hstreicher

Registriert seit: 21. Nov 2009
220 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: Aufbau einer Währungstabelle

  Alt 21. Jan 2015, 09:58
Welche Felder haben denn einen Index ?

ggf auf die Typisch abgefragten Felder einen Index anlegen
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#6

AW: Aufbau einer Währungstabelle

  Alt 21. Jan 2015, 10:24
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.
Was meinste Du mit "..auf den aktuellen Datensatz zugreifen.."?
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:
select * from wechselkurshistorie
where ..siehe unten bei DeddyH
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)
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?
Gruß, Jo

Geändert von jobo (21. Jan 2015 um 10:42 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#7

AW: Aufbau einer Währungstabelle

  Alt 21. Jan 2015, 10:30
Ich hätte eher so gedacht (ungetestet):
SQL-Code:
SELECT
  *
FROM
  wechselkurse
WHERE
  Datum = (
    SELECT
      MAX(Datum)
    FROM
      wechselkurse
    WHERE
      Datum <= :Abfragedatum
  )
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#8

AW: Aufbau einer Währungstabelle

  Alt 21. Jan 2015, 10:42
Ich hätte eher so gedacht
Ja, hätt ich auch mal gedacht, dann würde da oben nicht so ein Schrott stehen
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#9

AW: Aufbau einer Währungstabelle

  Alt 21. Jan 2015, 10:55
Mach Dir nichts draus, sowas passiert mir auch öfter
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: Aufbau einer Währungstabelle

  Alt 21. Jan 2015, 13:38
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;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (21. Jan 2015 um 13:41 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz