Datenbank vs. normale Datendatei?

  • Was spricht eigentlich für eine Datenbank in meinem Fall?
    Natürlich kenne ich die Vorzüge einer SQL Datenbank. Auch wenn ich noch nicht so viel damit gemacht habe. Eher war ich zu faul und nutze z.B. für die Kommentarfunktion einfach eine Text-Datei, die auf meinem Server erstellt wird. Die ist nämlich sowieso schon vorhanden, sprich jeder Blog-Artikel besteht aus einer Text-Datei. Die habe ich so aufgebaut, dass ich einfach mit HTML drauf los schreiben kann. Ich nutze nur Notepad++. Also ich habe kein Wordpress oder was anderes. Die ganze Webseite ist eigenes HTML, CSS, PHP usw.

    Unterhalb der HTML-Daten habe ich nun ein Marker gesetzt (z.B. "---kommentare---") und mit PHP entsprechend meine Seite aufgebaut, damit der Blogartikel erscheint und die Kommentare dazu. So kann ich die Kommentare (die sowieso erst einer Prüfung unterliegen) auch gleich mit HTML verarbeiten. Ich finde, dass geht dann alles Ruck-Zuck, so ganz ohne CMS. Einfach in den FTP-Server einloggen, die Daten verarbeiten und fertig.


    Da es sich hier ja nicht um Megabytes von Daten handelt, eher wohl max. 10-20kb pro Datei (+Kommentare ein paar Bytes mehr), verzichtete ich gleich am Anfang, mich mit SQL zu beschäftigen. Eher sehe ich ein Vorteil, da mit SQL wieder neue Verbindungen aufgebaut werden (kann ja dann auch mal nicht funktionieren), ich sie erstellen muss, neues Passwort usw. benötige und bei Änderung (neue Felder oder der Typ von einem Feld etc.) ich eigentlich viel mehr Zeit benötige. So wie ich das habe, kann ich schnell eingreifen und weil ich alles selber gemacht habe, sind irgendwelche Änderungen auch schnell erledigt.


    Also was spricht für eine SQL-Datenbank für ein paar Kilobytes an Daten oder was spricht dagegen, wenn ich mit PHP meine Daten-Dateien auf meinem Webserver erstelle, lösche, ändere?


    Info: Noch kann man im Browser manuell eingeben (.z.B. https://domain.de/daten/blog/artikel-dsgvoistdoof.gtl) und auf die Datendateien zugreifen. Der Inhalt wird dann clean im Browser angezeigt. Das sollte natürlich noch vermieden werden. Die sollen ja nur mit PHP gelesen werden. Muss noch schauen, wie ich das mache. Geht wohl irgendwie mit ".htaccess".

  • Also was spricht für eine SQL-Datenbank für ein paar Kilobytes an Daten oder was spricht dagegen, wenn ich mit PHP meine Daten-Dateien auf meinem Webserver erstelle, lösche, ändere?

    Da spricht nichts dagegen, wenn Du keine Fehler machst, alles absicherst und in Zukunft erweitern kannst.


    Dass offenbar interne Dateien in den öffentlich einsehbaren httpdocs liegen ist nicht empfehlenswert. =O

    Das kannst Du einfach oberhalb ablegen.


    Ich habe ähnliche Dinge früher auch so "programmiert". Heute - viele Jahre später - sträubt es mir die Haare.

    Sicherheit war nicht gegeben, Erweiterungen führten zu umständlichem Spaghetticode und weitergeben wäre auch nicht gegangen (ohne geschlagen zu werden).


    Heutzutage würde ich sowas nur noch mit Standardtools programmieren. SQlite wird hier und da schon produktiv verwendet (ein paar Milliarden Instanzen z.B. auf Smartphones) und arbeitet auch dateibasiert mit PHP.


    Ich selbst finde es immer schön etwas dazuzulernen.

    Da könntest Du z.B. Filterfunktionen einer Datenbank nutzen.


    Wie auch immer, die Sicherheit sollte an allererster Stelle stehen, danach kommt Funktionalität, Effizienz und Design nach eigenen Vorstellungen & Wissensdrang. :)

  • Dafür spricht auf jeden Fall dass ich mit einer SQL Abfrage sehr genau zusammenschneiden kann was (und wie) ich an Informationen brauche.

    Sowas wie:

    a) Gib mir die meistgelesenen Kommentare

    b) Suche nur im Kommentartitel

    c) Sortiere die Kommentare nach Wochentag


    Und dann natürlich die Möglichkeit mit update sehr einfach Daten ändern zu können.

    Und der Vorteil dass ich Redundanzen auslösen kann (der Username steht nicht in jedem Beitrag sondern nur eine Verknüpfung in die Usertabelle).

    Und dann wäre noch da Problem dass du höllisch aufpassen musst wie du die Datei schreibst. Machst du hier in deinem Code einen Fehler und der Server stürzt im falschen Moment ab so ist deine Datei plötzlich nur noch halb voll.

    Sowas verhindert eine Datenbank.


    Klar, mit wenigen Daten kann man das alles irgendwie noch umschiffen. Sobald aber potentiell mehrere Leute gleichzeitig auf die Daten zugreifen oder die Datenmenge größer wird ist eine Datenbank alternativlos.

  • Und dann wäre noch da Problem dass du höllisch aufpassen musst wie du die Datei schreibst. Machst du hier in deinem Code einen Fehler und der Server stürzt im falschen Moment ab so ist deine Datei plöttlich nur noch halb voll.

    Überhaupt die Behandlung von Transaktionen: Mehrere DB-Änderungen erst dann bestätigen (commit), wenn ein Vorgang inhaltlich abgeschlossen ist, sonst alle zugehörigen wieder zurücknehmen (rollback).


    Sowas selber zu programmieren, ist schon aufwändig und fehleranfällig.


    Es kommt aber m. E. noch ein sehr wichtiger Punkt hinzu: Zukunftsorientierung. Wenn MicNC nun ein RDBMS nutzt, lassen sich spätere Erweiterungen leicht vornehmen - vorausgesetzt das Datenmodell ist halbwegs intelligent entworfen. Mit eigenen Dateien und Lese- / Schreibroutinen wird das umständlich und potentiell Spaghetticode (nichts gegen Spaghetti…). Der anfangs höhere Lernaufwand rechnet sich sehr schnel!

  • […] bei Änderung (neue Felder oder der Typ von einem Feld etc.) ich eigentlich viel mehr Zeit benötige. So wie ich das habe, kann ich schnell eingreifen und weil ich alles selber gemacht habe, sind irgendwelche Änderungen auch schnell erledigt.

    Noch ergänzend: Der höhere Zeitaufwand relativiert sich mit steigender Lernkurve und „alles selbstgemacht“ wird schnell zum Nachteil, wenn (1.) andere Personen hinzukommen oder (2.) Du nach Jahren versuchst, Deinen Code bzw. die damaligen Gedankengänge nachzuvollziehen.


    Ich stimme Win98SE4ever vollkommen zu: Nutze wann immer möglich Standardwerkzeuge / -techniken.

  • Ok, Danke für die Infos.

    Noch kann ich ja das ändern. Der PHP-Code ist noch nicht so groß. Wenn ich das erst mal angefangen habe, werde ich SQL natürlich selbst schätzen. Letztendlich wird es aber wohl so sein, dass sehr selten jemand einen Kommentar abgibt, da jeder auf Facebook und Co. seine Meinung der Welt unbedingt mitteilen möchte und kein nerv mehr frei hat, auf einer Webseite zu kommentieren. *lach

    Quote

    ...nach Jahren versuchst, Deinen Code bzw. die damaligen Gedankengänge nachzuvollziehen.

    Ja, dass kenne ich mit Delphi. Ein ehemaliges Projekt mit sehr vielen Codezeilen. Hatte mal ca. 2 Jahre pausiert und trotz eigenen Kommentaren im Code, brauchte ich eine Weile, bis ich mein Salat selbst wieder verstanden hatte ;)

  • Das gleiche hatte ich vor kurzem mit perl.

    Ich mache ja bei web-skripten fast alles mit php und perl nur wenn es sein muss.

    Drei Jahre altes perl-skript und ich habe meinen eigenen code nicht mehr verstanden. (War naürlich komplett unkommetiert. :S)

  • Eine Sache noch, wegen Datenbank vs. Datendatei.

    Ich hatte mich an etwas erinnert. Thema "flock" und schnell mal die KI gefragt. Geht schneller als es selbst zu machen ;)


    Speichern:


    Lesen:


    Ob nun für ein Blog (Kommentare speichern) oder ggf. auch für eine LOG-Schreiberei. Wäre das denn so in Ordnung? Das müsste doch ausreichen für eine normale Webseite? So wäre dann wenigstens etwas Prüfung und Wiederholungen dabei, damit die Chance des Schreibens und Lesens in einer Datei erhöht wird.

    Klar, ich versteh schon. SQL-Datenbank ist letztendlich wenn man alles richtig macht, viel angenehmer. Man hat halt viele Möglichkeiten. Würde ich jetzt auch ganz klar nutzen, wenn die Daten zu wichtig wären. In meinem Fall ist das halt nur ein Kommentarsystem. Mit gewissen Tricks versuche ich dann auf der einen Seite (normaler Besucher), den Kommentar zu speichern und auf der anderen Seite (Spam Bots) die Daten in eine LOG-Datei zu speichern. Es werden wohl mehr Bots vorbeikommen, als Besucher *lach aber ich wollte noch mal nachfragen, ob das mit diesem Code (also das mit flock um zu sperren) ausreichend wäre. Ich betreibe ja auch kein Facebook, Instagram etc. wo tausende von User gleichzeitig auf meiner Webseite sind. Das würde mit diesem kleinen Netcup Paket wohl sowieso nicht gehen.


    Aber die KI ist schon Cool. Sie hatte mir einen einfachen Code geschrieben und ich bat die KI noch, dass ich gerne mehrere Versuche haben möchte, bevor letztendlich die entsprechende Fehlermeldung ausgespuckt wird. Und Ruckzuck hat die KI es mit 1 Sekunde (10x100ms) mit angeboten. Ich schrieb dann noch, ich hätte lieber 250ms und 3 Sekunden. Ruckzuck wurde der Code angepasst ;)

  • Vor ~12 Jahren habe ich sowas gebaut. Ne Handvoll Dateien und eine PHP Klasse iteriert durch die Dateistruktur und sucht nach bestimmten Parametern um die Informationen in diesen Dateien auf einer Website anzeigen zu lassen.


    So 2-3 Jahre hat das auch gut funktioniert, irgendwann brauchte es aber erweiterte Funktionen wie Schlagwortsuche. Da habe ich dann eine SQLite Datenbank dazu gebaut, aber weiterhin durch die Verzeichnisse iteriert.


    Das Projekt verwaltet heute knapp 98.000 Dateien und ist absolut nicht mehr performant. Ein einzelner Seitenaufruf dauert teilweise 20+ Sekunden.


    Im letzten Weihnachtsurlaub habe ich dann angefangen das zu neu zu schreiben. In .NET C# und mit PostgreSQL. Dateien gibt es noch, aber die Datenbank enthält nun einen Index welche Dateien und welche Metadaten es gibt und man kann über die DB suchen anstatt direkt im Dateisystem. Längster Seitenaufruf bisher war 1,2 Sekunden.


    Will sagen: Auf Datenbanken verzichten zu können hat lange gut funktioniert und die Anwendung sehr einfach gehalten, aber irgendwann wird der IO alles ausbremsen.


    Wenn es ausgeschlossen ist, dass es jemals so viele Dateien werden oder Du immer nur eine bestimmte Datei brauchst die man durch den Dateinamen vorhersagen kann, go for it. Mein hüpf.net nutzt zum Beispiel genau das. Jeder Seitenaufruf ruft immer nur genau ein Textfile auf, dementsprechend ist es egal wie viele Dateien es gibt. Ein Seitenaufruf wird immer gleich schnell sein.


    PS: Übrigens wenn es einfach um eine CMS-artige Website geht, nutze einen der unzähligen Static Page Generators wie Hugo oder Jekyll.

  • Also es geht ja nur um den Blog bei mir.
    Derzeit ist das so:

    URL = /blog/hugoistbauarbeiter
    URL = /blog/supermankannfliegen


    Entsprechend wird "hugoistbauarbeiter.dat" oder "supermankannfliegen.dat" gelesen. Diese Dateien erstelle ich manuell. Im Grunde nur ein HTML-Code mit dem Text über Hugo oder über den tollen Superman *lach. Eine Seite mit dem Blog-Artikel ist ja nicht immer gleich, sprich es werden Design-Elemente genutzt und für neue Artikel dann auch mal etwas in der eigenen Blog CSS-Datei hinzugefügt. So bin ich hier sehr flexibel, kann das alles vorab Lokal testen, bevor ich diese Datendateien per FTP hochlade.


    Die Kommentare werden durch ein Formular erst mal in einer extra Datei gespeichert. Wie schon erwähnt, entweder für ein Besucher-Kommentar oder für die Spam-Bots. Kommentare werden vor Veröffentlichung erst geprüft und manuell zu der Datendatei dann hinzugefügt. Also wenn jemand einen Kommentar über unseren tollen Superman hinterlassen möchte, kommt dieser später in die "supermankannfliegen.dat" rein. Als Marker, wo die Kommentare beginnen nutze ich einfach sowas wie "---kommentare---". Alles was darunter steht, sind die Kommentare und diese kann ich dann ebenfalls leicht mit HTML-Code anpassen, damit alles schön ausschaut. Wie gesagt, alles wird vorher Lokal getestet (wegen Design). Gerade dieser Test finde ich sehr vorteilhaft. Ok, mit einer Datenbank kann man das dann auch (wenn man es entsprechend programmiert) aber ich finde das in meinem Fall sehr gut gelungen. Die Artikel haben nämlich auch manchmal sehr anspruchsvolle Design-Bereiche, sprich Texte die per klick eingerollt werden oder eine Art Ebene über ein Bild, welches Text beinhaltet. Da muss ich schauen, dass alles passt. Und das geht halt recht gut, so wie ich es habe. Alles ohne CMS. Ich arbeite nur mit dem Notepad++. Das ist so meine Arbeitsweise.


    Aber die technische Seite wegen dem Lese, Schreibzugriff sagt ja, eine Datenbank wäre besser. Und bevor ich das alles etwas ändere, kam mir die Idee mit dem "flock" und was mir dir KI da ausgespuckt hat, schaut ja ganz positiv aus. Also das mit den 12 versuchen, max. 3 Sekunden. So wäre (wenn es technisch so ist) ja ein wenig Sicherheit dabei, wenn zufällig mehrere Besucher auf meiner Webseite sind. Die Datendateien werden nur von mir beschrieben, also der Besucher hat hier nur ein Lesezugriff. Somit sollte das erst mal sehr gut gehen. Aber auch der Schreibzugriff für die Kommentare, die erst in einer extra Datei gespeichert werden, ist mit diesen "flock" versehen. Ich kann mir das eher nur alles in der Theorie vorstellen. Wie es letztendlich wirklich ist, wenn mehrere Schreibzugriffe zeitgleich stattfinden und wie hier "flock" gut oder schlecht arbeitet, dazu kann ich selbst nichts sagen. Aber der Code schaut ja recht vernünftig aus.


    Letztendlich werden meist nur Lesezugriffe stattfinden und wenn es um Kommentare geht, sind es wohl mehr Spam-Bots, als echte Besucher. Bei den Spam-Bots wären Schreibfehler sowieso egal. Ich will die nur etwas protokolieren, um sie etwas zu filtern, ggf. sie per ".htaccess" zu sperren, wenn das überhaupt heute noch Sinn macht? Ich kenne das von früher so. Und wenn dann mal ein echter Besucher ein Kommentar hinterlassen möchte wird der Fall eher selten bis gar nicht eintreten, dass hier mehrere gleichzeitig was abschicken wollen. Aber wenn doch, diese paar Besucher... ich denke da müsste doch das "flock" gut arbeiten mit diesem KI generierten Code mit den 12 Schreibversuchen.


    Deswegen frage ich mich halt, ob ich mir deswegen SQL reinziehen muss. Und ich hasse neue Benutzernamen und Passwörter *lach. Braucht man ja wieder bei SQL. Weiterhin kann SQL auch Probleme verursachen. Dort gibt es auch mal Verbindungsfehler. Also warum der ganze Stress, wenn es jetzt nur um ein paar Kilobyte an Blogdaten geht. Nur diese Schreibzugriffs Geschichte sollte dann doch etwas funktionieren, wenn zufällig jeder meiner Besucher gleichzeitig über Superman einen Kommentar abschicken will. ;)

    Natürlich bietet SQL viele Vorteile aber die Blogdaten müssen nicht sortiert werden. Auch eine Blogsuche benötige ich nicht. Also die schönen Funktionen, die SQL bereitstellt, brauche ich eigentlich gar nicht für meinen Zweck.

  • Also für das was du vorhast klingt das mit Dateien problemlos machbar. flock() brauchst du auch nur fürs Schreiben.


    Der nächste Schritt wäre übrigens nicht eine full-blown Datenbank mit Usernamen sondern eine SQLite Datenbank. Die besteht nur aus einer Datei (naja, fast, es kommt da wohl mal gerne ne zweite dazu…) und kennt sowas wie User und Passwörter nicht. Dafür aber halt SQL als Abfragesprache.


    Bei deinem Ansatz würd ich Ansätze von Vorteilen für SQL sehen bei:

    - Sortieren der Kommentare

    - Speichern von Metadaten zu den Kommentaren die du nicht unbedingt ausgeben willst (IP, Uhrzeit, Mailadresse…)

    - Statistik (wieviele Kommentare hab ich, wer hat am meisten Kommentare abgegeben, Thema mit den meisten Kommentaren)


    Alles sicherlich nicht unbeding wichtig vorläufig mal.

  • Also für das was du vorhast klingt das mit Dateien problemlos machbar. flock() brauchst du auch nur fürs Schreiben.

    Das mit dem Lesen, da habe ich auch überlegt, ob "flock()" nötig ist. Die KI hat's halt hinzugefügt. Aber die entsprechenden Dateien, werden ja NUR gelesen. Ich könnte mir vorstellen, dass man hier "flock()" nutzen muss, wenn an anderer Stelle (anderer Prozess/Besucher) auch ein Schreibzugriff erfolgt. Damit in beiden Situationen (Lesen und Schreiben) es nicht kompliziert wird, wird dann wohl beim Lesen und Schreiben "flock()" eingesetzt.


    Danke für die Infos. :thumbup: