Langer Text zu Anfängerfragen, aber bitte trotzdem lesen!
Bernhard Peissl
- datenbank
Hallo,
Ich entschuldige mich gleich im Vorhinein für meinen elendslangen Text, aber ich hoffe, dass sich trotzdem jemand die Mühe macht!
Also, ich hoffe ich artikuliere mich jetzt halbwegs verständlich ;-)
Was ich machen will:
Die Firma in der ich als Homepage-Warter arbeite bietet Weiterbildungsseminare an. Da ich aber die ganze Zeit damit beschäftigt bin Kursprogramme aus dem doc Format in html zu übertragen (wer das schon mal probiert hat weiss wie sehr ich leide), und mir das schön langsam ein bissl zu fad wird, habe ich mir folgendes gedacht: Ich schreib mir eine kleine Kurs-Datenbank, wo die Mitarbeiter in Formularfeldern die Daten eingeben, und ich mit PERL mir daraus so ein kleines Datenbänkchen baue.
Soweit so gut. Nun habe ich zwar schon ein wenig Ahnung von PERL allerdings habe ich noch nie was mit Datenbanken zu tun gehabt, und bin daher ziemlich ratlos, wie ich das ganze organisieren soll. Daher schreib ich euch mal wie ich mir das gedacht hätte, und vielleicht könntet ihr mir ein paar Tips geben, ob das so funktioniert, ob das zuviel Rechenaufwand ist, zu lange Dauert, oder einfach nur eine stumpfsinnige Idee ist ;-)
Ich hab mir das also so vorgestellt: Man kommt auf die Seite und wählt als Erstes den Bereich (Praktikanten-Ausbildung, Mitarbeiter-Ausbildung, EDV-Seminare, ...) Hier würde ich dann gleich mein erstes Script aufrufen, das die Daten aus einer Übersichtsdatei holt.
In die Übersichtsdatei würde ich einfach mal alle Kurse (pro Bereich)reinschreiben und zwar in jede Zeile ungefähr so:
KursNr::KursTitel::Untertitel::KurzeBeschreibung::LinkAufDieDetail-Datei
Das listet dann die Kurse für den gewählten Bereich auf. das Detailprogramm lege ich in eine Datei kursTitel.data oder so. Dort möcht ich dann folgendes (zeilenweise) reinschreiben:
Zielgruppe:: ....\n
Kursinhalt:: ....\n
...
Da es für einen Kurs mehrere Termine und Orte gibt, speichere ich
die separat in einer kursTitel.term oder so. Und zwar pro Zeile einen Termin + Ort und Zeit, sowie Platz für Zusatzinfos wie: Ausgebucht, Neu, Terminänderung, ...
Wenn also nun das Detailprogramm aufgerufen wird, mache ich diese zwei dateien auf und lese die Daten raus. Ist das aber gscheit, oder hab ich da was übersehen? Ich will da nix verpfuschen, drum frag ich euch, schliesslich ist es nicht irgendein Probierprojekt, sondern soll aktiv ca 200 Kurse verwalten!
Im speziellen hätte ich folgende Frage:
Liebe Grüsse
Bernhard
Hi,
Ich fasse Euer Schweigen als stille Bestätigung auf, dass das so
hinhauen wird ;-)
So, und jetzt geh ich mir mal kräftig einen hinter die Binde kippen,
äähhmm ich meine ich fahre auf die Weinkost ;-)
Bis bald
Bernhard
Hallo Bernhard,
zuerst 'mal ein Lob :-), für jemand, der bis jetzt nichts mit Datenbanken zu tun hatte, hast du einen der häufigsten Fehler vermieden, nämlich alles in eine große Tabelle a-la Excel zu packen, und damit viele Informationen x-mal zu speichern. Deine Tabellenstruktur ist bis auf ein paar Einzelheiten durchaus richtig.
Grundsätzlich hört sich Deine Beschreibung so an, als würdest Du das ganze dann über das Filesystem implementieren, also ohne Datenbankserver. Das geht, ich würde aber empfehlen, daß Du dich lieber mal 1-2 Tage hinsetzt, dich mit dem DBI-Modul und SQL auseinandersetzt, und es mit einer richtigen Datenbank machst, daß erspart Dir im Endeffekt viel Arbeit (und Du hast was nützliches dazugelernt ;-)).
In die Übersichtsdatei würde ich einfach mal alle Kurse (pro Bereich)reinschreiben und zwar in jede Zeile ungefähr so:
KursNr::KursTitel::Untertitel::KurzeBeschreibung::LinkAufDieDetail-Datei
Das listet dann die Kurse für den gewählten Bereich auf. das Detailprogramm lege ich in eine Datei kursTitel.data oder so. Dort möcht ich dann folgendes (zeilenweise) reinschreiben:
Zielgruppe:: ....\n
Kursinhalt:: ....\n
Da in den beiden Tabellen keine Daten doppelt vorkommen können, kannst Du das ruhig in einer Tabelle zusammenfassen, außerdem brauchst Du noch ein Feld für Bereich. 'LinkAufDieDetail" kannst Du Dir sparen, das kann man in SQL einfacher machen, s.u..
Da es für einen Kurs mehrere Termine und Orte gibt, speichere ich
die separat in einer kursTitel.term oder so. Und zwar pro Zeile einen Termin + Ort und Zeit, sowie Platz für Zusatzinfos wie: Ausgebucht, Neu, Terminänderung, ...
und die KursNr des Hauptdatensatzes brauchst Du dann natürlich noch.
» - Ist die Datei-Benennung geschickt (kursTitel.data/term), oder sollte ich besser eigene Nummern vergeben und diese in den Dateinamen bringen? Ich brauch ja irgendwas, damit ich nicht lange nach der Detail-Datei ;-) suchen muss!
Das ist ein Problem, daß Du mit einer richtigen Datenbank nicht mehr hast, Du findest den Detaildatensatz per SQL über die KursNr. Beispiel:
Die Hauptdatei ruft die Detaildatei mit "detail.cgi?kursnr=27" auf, in dem Skript der Detaildatei hast du dann den SQL-Befehl "SELECT * FROM termine WHERE KursNR=27".
Wegen der Performance brauchst Du Dir bei so einem Projekt wohl wirklich keine Sorgen machen, so einfache Datenbanken laufen auch auf normalen Webservern bis zu ca. hundertaused Datensätzen und ebensovielen Zugriffen/Monat ohne Probleme, solange Du nicht wirklich komplizierte Abfragen machst, und danach sieht es nicht aus.
- Solte ich besser Seifenfabrikant o.Ä. werden, aber bitte um Himmelswillen meine Finger vom Programmieren lassen ;-)
Soweit ich das beurteilen kann, sicher nein, aber falls Du zufällig das umweltfreundliche Geheimrezept für ein Vanilleschaumbad mit nach Vanilleeis schmeckenden, schimmernden Blasen in der Schublade hast, behalte ich mir vor, das Urteil zu revidieren ;-)
Viele Grüße
Stephan
Hallo Stefan
Hui, da hat sich ja doch noch jemand gemeldet *freufreu*
zuerst 'mal ein Lob :-), für jemand, der bis jetzt nichts mit
Datenbanken zu tun hatte, hast du einen der häufigsten Fehler
vermieden, nämlich alles in eine große Tabelle a-la Excel zu
packen, und damit viele Informationen x-mal zu speichern.
Danke, war aber irgendwie logisch, denn manche Kurse haben 20
Termine, und wenn ich da jedesmal das ganze Detailprogramm gleich
mitreinspeichere, na dann gute Nacht ;-)
Grundsätzlich hört sich Deine Beschreibung so an, als würdest Du
das ganze dann über das Filesystem implementieren, also ohne
Datenbankserver.
Stimmt, hab ich vor!
Das geht, ich würde aber empfehlen, daß Du dich lieber mal 1-2
Tage hinsetzt, dich mit dem DBI-Modul und SQL auseinandersetzt,
und es mit einer richtigen Datenbank machst.
Hab ich auch vor, später, aber derzeit habe ich keine Datenbank zur
Verfügung und mein Chef glaubt schon dass es sich nicht auszahlt,
soviel Geld für mich = Internet (ich bin dort der einzige, der sich
ums Internet kümmert) zu zahlen, geschweige denn für eine Datenbank!
Nene, das spielt vorerst noch nicht :-(
das erspart Dir im Endeffekt viel Arbeit (und Du hast was
nützliches dazugelernt ;-)).
Ich glaub aber fast, noch nützlicher wäre es wenn ich mal versuchen
würde eine Datenbank _selbst_ zu _schreiben_! SQL läuft mir nicht
davon. Da hab ich später noch Grösseres damit vor. Denn wenn ich mal
gross und gscheit bin, will ich unsere Firmendatenbank direkt ins
Web einbinden, Real-Time-Kursanmelding quasi ;-) Würd ne Menge Zeit=Kosten einsparen!
Bis dorthin ist es aber noch ein langer Weg, ich weiss :-(
In die Übersichtsdatei würde ich einfach mal alle Kurse (pro
Bereich)reinschreiben und zwar in jede Zeile ungefähr so:
KursNr::KursTitel::Untertitel::KurzeBeschreibung::LinkAufDieDetail-Datei
Das listet dann die Kurse für den gewählten Bereich auf. das
Detailprogramm lege ich in eine Datei kursTitel.data oder so.
Dort möcht ich dann folgendes (zeilenweise) reinschreiben:
Zielgruppe:: ....\n
Kursinhalt:: ....\n
Da in den beiden Tabellen keine Daten doppelt vorkommen können,
kannst Du das ruhig in einer Tabelle zusammenfassen, außerdem
brauchst Du noch ein Feld für Bereich.
Danke, das hätt ich doch glatt vergessen !!
Aber zu ersterem: Ich fürchte das geht so einfach nicht, denn der
Kursinhalt ist immer ein Ziemlich langer Text, und auch Zielgruppe,
Kursziel, etc... sind gerne recht ausschweifend formuliert ;-)
Ausserdem kann ich die eine Datei dann dazu verwenden, die Übersicht
aller Kurse anzuzeigen, und die andere spuckt dann echt nur das
Detailprogramm aus!
'LinkAufDieDetail" kannst Du Dir sparen, das kann man in SQL
einfacher machen, s.u..
Was ich allerdings leider nicht habe!
und die KursNr des Hauptdatensatzes brauchst Du dann natürlich noch.
Wo finde ich die? Wahrscheinlich irgendwo in der Firmendatenbank oder muss ich die selbst generieren?
- Solte ich besser Seifenfabrikant o.Ä. werden, aber bitte um
Himmelswillen meine Finger vom Programmieren lassen ;-)
Soweit ich das beurteilen kann, sicher nein, aber falls Du
zufällig das umweltfreundliche Geheimrezept für ein
Vanilleschaumbad mit nach Vanilleeis schmeckenden, schimmernden
Blasen in der Schublade hast, behalte ich mir vor, das Urteil zu
revidieren ;-)
Ist gebonkt, Vielleicht erfinde ich ja auch als erster den warmen
Eislutscher, aber wenn, dann versprech ich dir, bekommst du den
ersten ;-)
Schöne Grüße
Bernhard
Hallo Bernhard,
Nene, das spielt vorerst noch nicht :-(
Ein Datenbankserver ist so teuer nicht, wenn Ihr den Server bei einem Provider gemietet habt, ist das gegenüber dem Server ohne Datenbank meistens so ca. 10-50 Mark/Monat teuerer - und dann sag' Deinem Chef doch einfach, daß Dir das im Monat einen Tag Arbeit erspart, und Ihr viele neue tolle Sachen damit machen könnt, wie z.B. die direkte Online-Anmeldung inklusive der Übertragung der Anmeldungsdaten in eine Serienbriefdatei für die Anmeldebestätigung, dann kann er ja nachrechnen, was billiger ist.
Ich glaub aber fast, noch nützlicher wäre es wenn ich mal versuchen
würde eine Datenbank _selbst_ zu _schreiben_!
Das erste, was Du dabei lernen wirst, ist, daß eine Datenbank selbst zu schreiben ziemlich bitchy ist, vor allem, wenn das Projekt größer wird :-(. Und daß Du, wenn Du später auf SQL umsteigst, alles nochmal schreiben mußt.
» Aber zu ersterem: Ich fürchte das geht so einfach nicht, denn der
Kursinhalt ist immer ein Ziemlich langer Text, und auch Zielgruppe,
Kursziel, etc... sind gerne recht ausschweifend formuliert ;-)
OK, wenn Du es über das Filesystem machen willst, hast Du recht, da ist der Weg mit zwei Tabellen besser, Datenbankserver haben Möglichkeiten, das zu umgehen (hint! ;-))
» Wo finde ich die? Wahrscheinlich irgendwo in der Firmendatenbank oder muss ich die selbst generieren?
Nein (ich gehe hartnäckig davon aus, daß ich Dich dochnoch zu SQL überreden kann ;-): Du schreibst die KursNr des Hauptdatensatzes auch noch in jeden Datensatz der Termin-Tabelle, und kannst dann mit dem SQL aus meinem Beispiel die entsprechenden Datensätze finden. Geht natürlich auch per Filesystem, Du loopst einfach durch alle Zeilen, und vergleichst die KursNr.
Ist gebonkt, Vielleicht erfinde ich ja auch als erster den warmen
Eislutscher, aber wenn, dann versprech ich dir, bekommst du den
ersten ;-)
Danke ;-)
Viele Grüße
Stephan
Hallo Stefan,
Ein Datenbankserver ist so teuer nicht, wenn Ihr den Server bei
einem Provider gemietet habt, ist das gegenüber dem Server ohne
Datenbank meistens so ca. 10-50 Mark/Monat teuerer - und dann
sag' Deinem Chef doch einfach, daß Dir das im Monat einen Tag
Arbeit erspart, und Ihr viele neue tolle Sachen damit machen
könnt, wie z.B. die direkte Online-Anmeldung inklusive der
Übertragung der Anmeldungsdaten in eine Serienbriefdatei für die
Anmeldebestätigung, dann kann er ja nachrechnen, was billiger ist.
Echt, das geht?? Serienbriefe aus ner Datenbank ? Schwer ? Was
meinst du mit direkter Online-Anmeldung, das was ich gesagt habe,
was ich machen will, wenn ich mal "gross und gscheit" bin, nämlich
die Firmendatenbank direkt ans Web anbinden? Hui hui hui, das wär ja
mutig, mit meinem Wissen über Datenbanken !!
Na ich werd jedenfalls mal probieren, ob ich ihm das unter die Nase
reiben kann ;-)
Mal eine Generelle Frage, aber bitte lach mich nicht aus, ich kann
mir die Funktionsweise von Datenbanken einfach noch nicht so recht
erklären: Angenommen also ich habe jetzt mein Super-
Kursverwaltungsprogramm fertig, nun will ich z.B: noch meinen Online-
Shop auch in eine Datenbank auslagern. Geht das mit ein und
derselben? Was ich so mitbekommen habe, stehen die Datensätze
in "Tabellen", die irgendwie miteinander verküpft sind. Wenn man
also eine Tabelle erzeugt, die mit keiner anderen verknüpft ist, hat
man quasi ja eine _neue_ Datenbank oder?
Das erste, was Du dabei lernen wirst, ist, daß eine Datenbank
selbst zu schreiben ziemlich bitchy ist, vor allem, wenn das
Projekt größer wird :-(. Und daß Du, wenn Du später auf SQL
umsteigst, alles nochmal schreiben mußt.
Ok, ok, überzeugt ;-)
Nein (ich gehe hartnäckig davon aus, daß ich Dich dochnoch zu SQL
überreden kann ;-): Du schreibst die KursNr des Hauptdatensatzes
auch noch in jeden Datensatz der Termin-Tabelle, und kannst dann
mit dem SQL aus meinem Beispiel die entsprechenden Datensätze
finden. Geht natürlich auch per Filesystem, Du loopst einfach
durch alle Zeilen, und vergleichst die KursNr.
Und genau da hab ich eben Angst, dass das zulange dauert!
Schöne Grüsse
Bernhard
Hallo Bernhard,
Echt, das geht?? Serienbriefe aus ner Datenbank ? Schwer ?
Wenn die Datenbank ODBC fähig ist, kannst Du sie z.B. als Datenquelle für einen Word-Serienbrief benutzen, ist auch nicht viel schwerer als ein normaler Serienbrief.
meinst du mit direkter Online-Anmeldung, das was ich gesagt habe,
was ich machen will, wenn ich mal "gross und gscheit" bin, nämlich
die Firmendatenbank direkt ans Web anbinden? Hui hui hui, das wär
Ja, allerdings stehen die Daten ja dann mal in der Datenbank des Webservers, von da aus mußt Du Sie Dir wieder in die Firmendatenbank holen, die interne Datenbank direkt anzubinden, kann je nach Konfiguration des Netzwerkes (Firewall, Proxy, usw.) ein *bißchen* komplizierter sein, wenn man keine Sicherheitslücken lassen will.
Mal eine Generelle Frage, aber bitte lach mich nicht aus, ich kann
mir die Funktionsweise von Datenbanken einfach noch nicht so recht
erklären: Angenommen also ich habe jetzt mein Super-
Kursverwaltungsprogramm fertig, nun will ich z.B: noch meinen Online-
Shop auch in eine Datenbank auslagern. Geht das mit ein und
derselben? Was ich so mitbekommen habe, stehen die Datensätze
in "Tabellen", die irgendwie miteinander verküpft sind. Wenn man
also eine Tabelle erzeugt, die mit keiner anderen verknüpft ist, hat
man quasi ja eine _neue_ Datenbank oder?
Ja, aber nur quasi ;-). Normalerweise erzeugt man eine neue Datenbank, wenn zwei Tabellengruppen absolut nichts miteinander zu tun haben, und dies auch nie haben werden.
Und genau da hab ich eben Angst, dass das zulange dauert!
Eine Datenbank legt für Felder, nach denen häufig gesucht wird, wie die KursNr, einen Index an, so daß Sie einfach nur im Index nachschaut, wo die passenden Datensätze stehen, und dann direkt dorthin springen kann.
Viele Grüße
Stephan
Hallo Stefan !
Vielen Dank für deine Geduld mit mir, ich glaube, ich hab jetzt einen _kleinen_ Einblick in die Welt der Datenbanken bekommen. Mit diesem Wissen fahr ich jetzt jedenfalls ein paar Tage die Köstlichkeiten des Burgenlades (Österreich) testen. Die dionysischen selbstverständlich ;-)
Liebe Grüsse
Bernhard
Hallo Bernhard
Grundsätzlich hört sich Deine Beschreibung so an, als würdest Du
das ganze dann über das Filesystem implementieren, also ohne
Datenbankserver.Stimmt, hab ich vor!
Das geht, ich würde aber empfehlen, daß Du dich lieber mal 1-2
Tage hinsetzt, dich mit dem DBI-Modul und SQL auseinandersetzt,
und es mit einer richtigen Datenbank machst.Hab ich auch vor, später, aber derzeit habe ich keine Datenbank zur
Verfügung und mein Chef glaubt schon dass es sich nicht auszahlt,
soviel Geld für mich = Internet (ich bin dort der einzige, der sich
ums Internet kümmert) zu zahlen, geschweige denn für eine Datenbank!
Nene, das spielt vorerst noch nicht :-(das erspart Dir im Endeffekt viel Arbeit (und Du hast was
nützliches dazugelernt ;-)).Ich glaub aber fast, noch nützlicher wäre es wenn ich mal versuchen
würde eine Datenbank _selbst_ zu _schreiben_! SQL läuft mir nicht
davon. Da hab ich später noch Grösseres damit vor. Denn wenn ich mal
gross und gscheit bin, will ich unsere Firmendatenbank direkt ins
Web einbinden, Real-Time-Kursanmelding quasi ;-) Würd ne Menge Zeit=Kosten einsparen!Bis dorthin ist es aber noch ein langer Weg, ich weiss :-(
Ich würde Dir doch dringend raten, das DBI-Modul zu verwenden.
Zu DBI gibt es nämlich auch ein file-basierten DBD-Treiber, mit dem Du SQL-mässig auf normale Textdateien zugreifen kannst, die keinen SQL-Server benötigen.
Zur Erläuterung:
Das DBI-Modul (Database Interface) ist ein Standard-Perl-Modul, welches alle Datenbankzugriffe über eine einheitliches Schnittelle kapselt.
Direkt darunter verwendet das DBI-Modul datenbankspezifische Treiber, die sogenannten DBD-Module (Database Driver), für den Zugriff auf die Datenbank.
Die DBD-Module gibt es für Oracle, MS-SQL, Sybase, Informix, MySQL, etc., alles ausgewachsene SQL-Server.
Zusatzlich gibt es aber auch ein DBD-Modul für den Zugriff über ODBC und, für dich im Moment interessannt, das DBD::CSV-Modul, das direkt auf kommaseparierte (oder anders separierte) Dateien zugreift.
Der Vorteil bei DBI ist, dass Du für alle unterschiedlichen Datenbanken denselben Code schreibst, beim Wechsel der Datenbank jedoch nur das DBD-Modul auswechselst. (Theoretisch, in der Praxis klappt dies auch weitgehend, ausser einigen treiberabhängigen Unterschieden die doch noch vorhanden sind).
Bei allen Zugriffen über DBI arbeitest du mit SQL-Befehlen, ein einheitlicher Standard für DB-Zugriffe.
Für Dich ergeben sich bei der Verwendung des DBI-Moduls etliche Vorteile:
Ich hoffe, Dich damit auch auf den "rechten" Weg führen zu können.
Hier noch zwei Links zu DBI:
Kurze Dokumentation des DBI auf perl.com (Englisch): http://www.perl.com/pub/1999/10/DBI.html
Deutsche Übersetzung der Manpage zum DBI-Modul: http://www.oreilly.de/catalog/perlmodger/manpage/dbi.htm
Grüsse
Tom