Autor Beitrag
bflegel
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 193
Erhaltene Danke: 1

Win XP, Win 7, BS2000
D5
BeitragVerfasst: Do 29.05.08 17:28 
Hallo an alle,

ich habe ein Verständnisproblem beim Speichern von Daten in eine DB. Bisher habe ich immer alle Daten in eine Tabelle geschrieben und daher auch wieder einfach auslesen können (ich verwende ZEOS und Firebird embedded). Da bei meinem nächsten Projekt aber immer wiederkehrende Begriffe auftauchen, wollte ich diese in mehrere Tabellen aufteilen.

Folgende Tabellen will ich anlegen:
ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
---------------------------------
Tabelle1

idx_sendung | idx_sender | aufnahmezeit

1 | 3 | 20.04.2008 18:00 bis 20.04.2008 20:00
3 | 2 | 21.04.2008 07:00 bis 21.04.2008 13:00
2 | 1 | 22.05.2008 20:00 bis 22.04.2008 21:00
...
---------------------------------
Tabelle2

idx_sendung | sendung

1 | Andromeda
2 | Sportschau
3 | Nachrichten
4 | Tatort
5 | Emergency Room
...
---------------------------------
Tabelle3

idx_sender | sender

1 | GIGA
2 | ARD
3 | Pro7
4 | ZDF
5 | BR3
...
---------------------------------


Der Grundgedanke beim Lesen der Datensätze ist mir klar: Für die erste Zeile der Tabelle1 hole 'idx_sendung' aus Tabelle2 und 'idx_sender' aus Tabelle3. So erhalte ich den ganzen "lesbaren" Datensatz (auch wenn ich diesen SQL-Befehl mir noch nicht angeeignet habe).

Aber wichtiger ist doch erst mal: Wie bekomme ich die Daten in die DB?

Beispiel:
Folgende Daten sollen in die DB aufgenommen werden:

Tagesschau | ARD | 25.05.2008 20:00 bis 25.05.2008 20:15

Beim Speichern muss ich doch zuerst kontrollieren:

1. Gibt es den Namen der Sendung in Tabelle2, wenn ja idx_sendung auslesen; wenn nein, erstelle einen neuen Eintrag in Tabelle2 und "merke" idx_sendung.

2. Das selbe Spiel mit Tabelle3 (Name des Senders).

3. Speichern der gewonnenen Daten in Tabelle1.

Genau der Ablauf dieser Schritte ist mir nicht klar. Kann man dies mit einer (oder zwei) SQL-Anweisungen vollständig machen oder muss ich jeden einzelnen Schritt "zu Fuß" machen?

Könnte mich da jemand aufklären oder mir ein gut verständliches Tutorial empfehlen?

bye
bflegel

_________________
I know all the jokes about my name
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Fr 30.05.08 00:24 
Was ist daran so schwer ? Der Hauptbegriff ist der Sender. Der hat Sendungen. Und die kommen immer wieder und haben eine Uhrzeit. Jeder Sender kriegt eine ID verpasst. Die Sender und die Uhrzeiten auch. Die IDs und nur die werden an abhängige Tabellen weitergereicht. Da kommt zuerst die Sendung und die kriegt neben der eigenen ID noch die vom Sender als ID_Sender. Usw.

_________________
Gruß
Hansa
bflegel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 193
Erhaltene Danke: 1

Win XP, Win 7, BS2000
D5
BeitragVerfasst: Fr 30.05.08 06:01 
Hallo Hansa,

die Logik ist mir schon klar, aber:

Vor dem Speichern muss ich doch erst wissen welche ID's ich speichern muss (und diese ggf. erst anlegen). Muss ich diese ID's erst per SELECT aus den einzelnen Tabellen auslesen und ggf. anlegen oder kann man dies "kombiniert" in einem SQL-Befehl angeben und die DB macht den "Rest" (Auslesen der ID, ggf. Anlegen).

Ich hoffe mich verständlich ausgedrückt zu haben.

bye
bflegel

_________________
I know all the jokes about my name
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Fr 30.05.08 06:24 
Entweder du lässt das die DB machen (mit einer Stored Procedure), oder Du machst das in Delphi selbst.

Ich persönlich würde eine Stored Procedure schreiben, der Du die Sendung, Sender und die Zeiten übergibst. Die macht das dann für Dich. Das ist schneller, weil nur 1x eine Kommunikation mit dem RDBMS stattfindet. Per Delphi hast Du 3-6 Einzelbefehle, bis der Speichervorhang abgeschlossen ist. In einer Einzelplatzversion ist das egal, aber im Netz nicht.

Da Du FB-Embedded verwendest, kannst Du auch auf die Abfrage, ob es die Sendung/Sender schon gibt, verzichten, indem du diese Tabellen im Speicher hälst. Dann hast Du aber ein Skalierungsproblem, wenn Du die SW später mehrbenutzerfähig machen willst.

Dies ist ein guter Zeitpunkt, deine Daten in Objekte zu kapseln und diesen Objekten einen Lade/Speichermechanismus zu spendieren. Vielleicht implementierst Du gleich noch zwei Objekte 'TSender' und 'TSendung', die dann selber dafür sorgen, das eventuelle neue Einträge gleich erzeugt werden.

_________________
Na denn, dann. Bis dann, denn.
baka0815
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 489
Erhaltene Danke: 14

Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
BeitragVerfasst: Fr 30.05.08 11:09 
Statt beim Anlegen zu prüfen ob es die Sendung bereits gibt, könntest du das Design deiner Software umstellen.

Ich vermute, dass du momentan "Tagesschau | ARD | 25.05.2008 20:00 bis 25.05.2008 20:15" als Text übergibst. Statt dessen würde sich anbieten, Verwaltungsmasken für die Sender und Sendungen zu erstellen.
So hat du eine Maske in der du neue Sender anlegen bzw. alte bearbeiten kannst; das gleiche für die Sendungen.

Dort, wo du dann den Eintrag in Tabelle1 vornimmst hast du zwei Combo-Boxen in denen du einmal alle Sender und einmal alle Sendungen anzeigst (wobei die Sendung eigentlich auch direkt an den Sender gekoppelt sein könnte).
Durch die ComboBoxen zeigst du dem Benutzer den Namen der Sender an, hälst intern aber die die ID (idx_sendung) und kannst dann so das SQL zusammenbauen ohne abfragen zu müssen, ob es Sender und/oder Sendung bereits in der Datenbank gibt, da diese separat angelegt worden sein müssen.

Auf jeden Fall würde ich darüber nachdenken, was user profile iconalzaimer über die Kapselung in Objekte gesagt hat, da das durchaus sinnvoll sein kann und einiges erleichtert.
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Fr 30.05.08 12:13 
Er meint über Combobox indirekt die Sender-ID zur Verfügung zu haben. Bei Sendungen/Uhrzeiten hört es dann aber schon auf. 8) Sofern Dir Stored Procedures nicht geläufig sind, dann muss sich das ändern. :mrgreen:

_________________
Gruß
Hansa
baka0815
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 489
Erhaltene Danke: 14

Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
BeitragVerfasst: Fr 30.05.08 13:39 
user profile iconhansa hat folgendes geschrieben:
Er meint über Combobox indirekt die Sender-ID zur Verfügung zu haben. Bei Sendungen/Uhrzeiten hört es dann aber schon auf. 8)

Wen/Was genau meinst du damit?
Zitat:
Sofern Dir Stored Procedures nicht geläufig sind, dann muss sich das ändern. :mrgreen:

Ich sehe nicht, warum man sich für so etwas unbedingt mit Stored Procedures auseinandern setzen sollte.
Stored Procedures sind eher schlecht zu debuggen und lohnen sich - meiner Meinung nach - daher erst, wenn es um Geschwindigkeit geht.
bflegel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 193
Erhaltene Danke: 1

Win XP, Win 7, BS2000
D5
BeitragVerfasst: Fr 30.05.08 19:02 
Hallo Leute,

die Idee von alzaimar die "kleinen" Tabellen (Sender und Sendung) im Speicher zu halten hat was. Das würde auch ein anderes Problem lösen.

Zur Vervollständigung:

@alzaimar:
- Es ist ein Einzelplatzprogramm (also nix multiuser oder Netz)
- Geschwindigkeit ist wohl nicht das Problem, da in der größten Tabelle (Uhrzeiten) vermutlich max. 500-1000 DS gespeichert werden (hoch geschätzt).

@baka0815:
- Die Sender und Sendungen zu koppeln ist -glaube ich- keine gute Idee, da theoretisch eine Sendung auf 2 Sendern laufen könnte (Wiederholungen).
- Ich übernehme die Daten aus der Zwischenablage in eine Stringlist (strlst[1]=Tagesschau, strlst[2]=ARD, strlst[3]=<uhrzeit>,strlst[4]=Tagesschau,...), die ich dann überprüfen will ob sie bereits vorhanden sind, falls nicht -> eintragen.

Ihr habt mir ja einige Sachen "um die Ohren gehauen" :)
Die werde ich mir in einer ruhigen Minute zu Gemüte führen (stored procedure, Objekte kapseln usw).

Vielen Dank für Eure Erklärungen/Anregungen.

Ich schließe hiermit diese Anfrage.

Einen schönen Abend wünsche ich.

bye
bflegel

_________________
I know all the jokes about my name
baka0815
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 489
Erhaltene Danke: 14

Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
BeitragVerfasst: Mo 02.06.08 08:54 
user profile iconbflegel hat folgendes geschrieben:
Ihr habt mir ja einige Sachen "um die Ohren gehauen" :)
Die werde ich mir in einer ruhigen Minute zu Gemüte führen (stored procedure, Objekte kapseln usw).

Wie gesagt: ich denke nicht, dass man für so ein "kleines" Beispiel unbedingt stored procedures verwenden muss/sollte, aber anschauen solltest du es dir auf jeden Fall. Wirst es vermutlich später brauchen.

Die Kapselung in Objekte solltest du dir definitiv angucken. Dauert dann zwar während der Entwicklung am Anfang etwas länger, später wirst du dann aber dankbar sein, das so gelöst zu haben, da Änderungen deutlich einfacher werden.