Bernhard Peissl: Langer Text zu Anfängerfragen, aber bitte trotzdem lesen!

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:

  • Wieviele "Tabellen ?!?" darf ich in externe Dateien auslagern, ohne dass die Performance leidet? Ich hab nämlich auch noch was für Referenten und Mitarbeiter der Firma vor ;-)
  • 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!
  • Solte ich besser Seifenfabrikant o.Ä. werden, aber bitte um Himmelswillen meine Finger vom Programmieren lassen ;-)

Liebe Grüsse
Bernhard

  1. 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

  2. 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

    1. 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

      1. 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

        1. 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

          1. 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

            1. 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

      2. 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:

        • Verwendung von bestehenden Perl-Modulen
        • DBD-Modul für filebasierte DB, somit auch keine Anschaffungskosten für SQL-Server
        • DBD-Module jederzeit austauschbar, damit Upgrade auf SQL-Server später möglich
        • Weitgehend einheitliche Schnittstelle für DB-Zugriffe, wenig Änderungen am Code notwendig
        • Ressourcen im Netz zu DBI (siehe unten)

        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