Daten wohin speichern?

tombe

Erfahrenes Mitglied
Was das Sperren angeht, hierzu würde ich die Felder "lock", "zeit" und "lockid" in die Tabelle aufnehmen.

In dem Moment wo jemand auf ein bestimmtes Skript (ob nun als Datensatz oder als Datei) zugreift, wird in der Tabelle das Feld "lock" überprüft ob es den Wert 0 hat. In diesem Fall bekommt das Feld "lock" den Wert 1, "zeit" bekommt die aktuelle Uhrzeit und bei "lockid" wird der Benutzername oder ähnliches gespeichert. Ab jetzt ist der Datensatz für andere gesperrt.

Hat das Feld "lock" den Wert 1, dann wird zusätzlich noch die beim Datensatz gespeicherte Uhrzeit geprüft. Sind hier z.B. 5 Minuten Differenz zur aktuellen Zeit, dann wird der Datensatz dem neuen Benutzer übergeben ("lockid" wird entsprechend geändert) weil die Aktion des Benutzers der im Moment eingetragen ist wohl nicht beendet wurde.

Beim Speichern der Änderungen wird dann geprüft ob der Datensatz von dem Benutzer gesperrt wurde der ihn jetzt speichern will.

Hoffe mal es ist verständlich was ich da geschrieben habe!?
 

RudolfG

Erfahrenes Mitglied
Bis Du eine MySQL-Datenbank "überlastest" kann viel Wasser die Spree runterlaufen. Also warum nicht den Code gleich drin speichern? Lieber verwalte ich 50.000 Datensätze als 50.000 Files auf dem Server :)

Sehe ich genauso! Als kleine "Speicherplatz"-Optimierung könntest du alle Quelltexte komprimieren und dann in die DB legen. Texte lassen sich seeeeeehr gut komprimieren und somit hast du noch viel mehr Reserven.

Allerdings solltest du hier zwischen der Performance und dem Speicherplatz-Verbrauch abwägen, denn bei jedem Lesen und Schreiben muss der Quelltext vorher de- komprimieren und das wird ein wenig Zeit einnehmen, was du normalerweise nicht wirklich spüren solltest aber bei hochperformanten Anwendungen (oder schwachen Systemen) ggf. schon etwas mehr.

Den Code "mergen" stell ich mir erst mal chaotisch vor... Herr Schmidt ändert hier was, fügt neue Variablen ein, Herr Müller ändert da was, verwendet vielleicht sogar Variablen von Herrn Schmidt, ohne es zu wissen; da möchte ich nicht wissen, was am Ende bei rauskommt. Es sei denn, man macht das von Hand. Für mich wär das nichts.
Bei längerem nachdenken (was um die Uhrzeit allerdings nicht mehr wirklich richtig funktioniert), wird die Problematik komplizierter. Man kann einen Datensatz oder Version ja nicht sperren, sobald die einer bearbeitet. Wenn der dann zwischendrin Bier holen oder ins Kino geht... Wenn andererseits 50 Leute gleichzeitig eine Version bearbeiten, wird's am Ende vermutlich 50 Varianten geben.
Aber da denke ich mal besser morgen drüber nach.

Das Problem ist nicht trivial, allerdings beweisen Subversion/Git etc. bereits das man damit sehr gut umgehen kann (und jedes System hat nun mal seine Vorteile aber auch Nachteile!) und wenn man in Teams arbeitet kommst um die Code-Verwaltung gar nicht rum. Klar wenn man gleich Stellen bearbeitet gibt es ein Konflikt und den muss man manuell lösen, allerdings wird dir jeder der mit solchen Systemen und im Team arbeitet sagen, dass diese Werkzeuge unverzichtbar und sehr gute Arbeit leisten (zu den Konflikten kommt es bei einer einigermaßen strukturierten Planung und Arbeitsteilung so gut wie gar nicht!).

Gruß
RudolfG
 

ComFreek

Mod | @comfreek
Moderator
@tombe: Ich verstehe nicht ganz folgenden Teil:
Hat das Feld "lock" den Wert 1, dann wird zusätzlich noch die beim Datensatz gespeicherte Uhrzeit geprüft. Sind hier z.B. 5 Minuten Differenz zur aktuellen Zeit, dann wird der Datensatz dem neuen Benutzer übergeben ("lockid" wird entsprechend geändert) weil die Aktion des Benutzers der im Moment eingetragen ist wohl nicht beendet wurde.


Anwendungen (oder schwachen Systemen) ggf. schon etwas mehr.
Ich bin bei United-Domains und habe deren Webspaceangebot, ob das hochperformant ist?

Ich habe jetzt mal folgende Tabelle:
SQL:
CREATE TABLE codes
(
  id INTEGER AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(30),
  code LONGTEXT,

  locked TINYINT,
  locktime INTEGER,
  lockauthor INTEGER  --verweist auf die Tabelle users
)

Allerdings könnte es sein, das irgendwann mal mehrere hunderte Benutzer diese Daten ändern wollen.
Wie macht denn z.B. Wikipedia das? Hier gibt es eine Tabellenstruktur, allerdings blicke ich nicht wirklich durch, denn in der Tabelle page wird kein Inhalt gespeichert...:confused:
 
Zuletzt bearbeitet:

tombe

Erfahrenes Mitglied
@tombe: Ich verstehe nicht ganz folgenden Teil:
Also jetzt gibt es uns beide als User und in der Tabelle stehen folgende Angaben:

Code:
locked | locktime         | lockauthor
1      | 23.11.10 - 17:15 | tombe

Wenn du jetzt den Datensatz zum Bearbeiten anklickst ist dieser zwar durch lock = 1 gesperrt, da aber die Uhrzeit (jetzt ist es bereits 17:24 Uhr) 9 Minuten zurückliegt, wir davon ausgegangen das ich den Vorgang nicht beendet habe.
Deshalb wird mein Eintrag entweder gelöscht oder aber wie folgt geändert:

Code:
locked | locktime         | lockauthor
1      | 23.11.10 - 17:24 | ComFreek

Somit bist du neuer "Besitzer" und darfst die Daten ändern.

Damit der Benutzer sieht wie viel Zeit im noch bleibt wäre vielleicht ein bisschen JavaScript nicht schlecht. Mit einer Uhr die die noch verbleibende Zeit bis zum Logout anzeigt.

Beim Speichern reicht es aus wenn nur der Name geprüft wird. Selbst wenn die Zeit abgelaufen sein sollte kommt dies nur zum Tragen wenn ein anderer auf die Daten zugreifen will.
Werden geänderte Daten gespeichert werden die 3 Felder so geändert:

Code:
locked | locktime         | lockauthor
0      |                  |

Somit darf der nächste ran.
 
Zuletzt bearbeitet:

ComFreek

Mod | @comfreek
Moderator
Zum Beispiel folgende Aktionen treten auf:
  1. 17:35 ComFreek bearbeitet Code A
  2. 17:40 Ich gehe kurz weg
  3. 17:44 tombe klickt auf "Bearbeiten" und erlangt die Rechte über Code A
Dann verliert ComFreek aber irgendwie den Code, den er bearbeitet hat?

Vielen Danke schonmal.
 

tombe

Erfahrenes Mitglied
Das ist richtig das du den Code verlierst (sofern nach 5 Minuten Abwesenheit die Sperre automatisch aufgehoben wird). Hier die richtige Zeitspanne zu finden dürfte schwer werden, aber es muss ja irgendwann eine Freigabe erfolgen.
Angenommen du beginnst morgens um 9.00 Uhr mit der Änderung und dann kommt ein dringender Anruf. Du verlässt die Wohnung (aber der PC bleibt an) und kommst erst abends um 22.00 Uhr wieder zurück. So lange könnte dann keiner was ändern!

Wenn du jetzt weitermachen würdest, dann würde ich eine Fehlermeldung anzeigen "Achtung der Vorgang wurde wegen Zeitüberschreitung abgebrochen."
Dann würde ich die jetzt aktuellen Daten anzeigen und zusätzlich aber auch das was von dir bearbeitet wurde.
Nachdem du bestätigt hast das du deine Änderungen nun immer noch speichern willst, bekommst du Zugriff (vorausgesetzt jetzt ist lock = 0).
 

ComFreek

Mod | @comfreek
Moderator
Was ist mit der Lösung zum manuellen Freigeben? Das erfordert doch zu viel Aufwand?!

Man könnte es natürlich so machen, dass die Änderungen einfach übernommen werden (inkl. Wortfilter). Aber es kann dann jeder irgendwas reinschreiben...
 

chickenwing

Mitglied
Mist, jetzt hab ich meinen Text gelöscht.....

Ohne jetzt tiefer in die Materie eingestiegen zu sein (meine Nacht war nur 2 Stunden lang) würde ich rein vom Bauch her sagen: Geht so nicht (nicht vom Code sondern von der "Abwicklung"). Ich habe mir mal eben subversion angeschaut und wenn ich sehe, aus wieviel Modulen das Teil besteht, dann würde ich erstmal sagen "Das in PHP und MySQL? Unmöglich." Jedenfalls aus meiner Sicht erstmal nicht ohne klare Vorgaben. 5 Minuten reichen definitiv nicht, um sich in den (veränderten) Code einzuarbeiten. Entweder sperre ich den Code erheblich länger (z.B. 2 Stunden; müsste man Erfahrungswerte sammeln), bis er ausgelogged wird bzw. früher, wenn die (neue) Version abgespeichert wird. Allerdings müsste die Sperre dann solange andauern, bis die neue Version auch freigeschaltet wird.

Klar können die im Team arbeiten, aber wie schon geschrieben wurde, wenn alles auch entsprechend strukturiert ist. Und da würde ich mal mutmaßen, dass dann eher modular programmiert wird, d.h., jeder kümmert sich nur um einen bestimmten Teil. Subversion bietet u.a. auch File Locking, Merge tracking und testen auf executable an. Das kann PHP alleine gar nicht leisten. Evtl. gäb's vielleicht 'ne Ajax-Lösung, die permanent "kontrolliert" und (z.B. alle 30 Sek.) anzeigt, was "die anderen" gerade tun. Was ich mir kompliziert vorstelle, wäre der Teil, wo die Bearbeitungsunterschiede gegenüber dem Orginal verglichen werden müssen. Temporäre Datei? Und was dann? Am Ende muss immer einer (oder per Abstimmung) entscheiden, was die Beta, der RC oder die Final ist.

Der meiner Meinung nach gangbarste Weg wäre , die Datei solange zu sperren, wie sie einer bearbeitet und zwischendrin per Refresh-Automatismus in festgelegten Intervallen - z.B. timer=>10 min. prüft, ob inzwischen ein Event (onclick, onkeypress oder was auch immer) ausgelöst wurde. Man kann per Ajax ja sehr gut einen Request an den Server absenden. Ich würde in einer Variablen nicht die absolute Zeit sondern nur die Differenz seit dem letzten event speichern, die PC-Zeit muss ja nicht gleich der Server-Zeit sein. Aber wenn die Differenz beim nächsten Refresh >10 ist, dann wird ausgelogged. Größtes Manko wäre, dass die maximale Verzögerung bei 19:59 min (bei 10min Refresh) liegen kann.
Aber selbst diese eigentlich noch im Verhältnis einfach nachzuvollziehende "Verarbeitungsweise" würde ich mir programmtechnisch erstmal kompliziert vorstellen.

Greetz
cw
 

ComFreek

Mod | @comfreek
Moderator
Der meiner Meinung nach gangbarste Weg wäre , die Datei solange zu sperren, wie sie einer bearbeitet
Dann kann eben kein anderer das bearbeiten und bei vielen Benutzern ist diese Möglichkeit nicht allzu gut finde ich.

Eigentlich habe ich vor eine Komponente für Joomla zu schreiben, somit ist ein Prommgrammierteil schon weg.

Am Ende muss immer einer (oder per Abstimmung) entscheiden, was die Beta, der RC oder die Final ist.
Für mich ist die Idee, dass ein Admin etwas freigibt, immer noch die Beste, denn damit können auch mehrere Versionen eingereicht werden. Aber es ist eben Aufwand.
Oder eben auf das Prinzip der Menge vertrauen, dass keiner was sinnloses darein postet.
 

tombe

Erfahrenes Mitglied
Also wenn ich mir den Beitrag nochmal von vorne durchlese, dann frag ich mich ob es nicht doch besser ist, die PHP-Skripts als Datei zu speichern.

Du hättest für jeden Beitrag eine Nummer die als Dateiname verwendet wird und könntest dann zusätzlich noch eine Versionsnummer dranhängen.

In der Datenbank selber werden dann z.B. Suchbegriffe, Username und die Freigabe gespeichert.

Wenn du (oder wer auch immer) eine geänderte Datei frei gibst, dann bekommt diese als Versionsnummer eine "0". Jeder Aufruf zum Herunterladen oder zum Bearbeiten greift auf diese Datei zu.

Es könnten so unzählige Änderungen gleichzeitig gemacht werden ohne das etwas überschrieben wird.

Ist nicht leicht hier den richtigen Weg zu finden.

Gruß Thomas