Grundsätzliches zur Speicherung von Daten

Hallo zusammen,

ich hoffe, dass ich hier im PHP-Forum richtig bin, obwohl die Frage auch auf MySQL abzielt.

Es geht um eine Grundsätzliche Vorgehensweise, wie Daten gespeichert werden sollen, die über eine PHP-Maske eingegeben werden.

Nachdem ich also die Seiten soweit mit Textfeldern, Auswahllisten etc. fertig gestaltet habe, müssen die eingegebenen Daten in die MySQL-Datenbank.

Ich habe leider nicht viel Ahnung von Datenbanken. Mir ist klar was der Primärschlüssel, Fremdschlüssel, Normalisierung etc. ist. Aber ich weiß nicht wie viel Arbeit in Bezug auf die Datenverwaltung ich der Datenbank überlassen muss, und wie viel ich PHP überlassen muss.

In meinem Fall bekommt jeder User, der sich in das PHP-Programm einloggt eine Benutzer-ID, die als Primärschlüssel dient. Damit werden dann auch seine Daten gespeichert und identifiziert.

Doch wie geht das nun künftig mit weiteren Daten, wie Kundendaten, Vertragsdaten etc.? Wird ein Vertrag erfasst, so bekommt dieser einen Primärschlüssel über auto_inkrement zugewiesen. Damit dieser Vertrag dann auch dem Betreuer und dem Kunden zugewiesen werden kann, muss in der Vertragstabelle die Benutzer-ID des User hinterlegt sein und eine Kundennummer, die wiederum aus einer Kundentabelle hervorgeht. Ich benötige also immer einen Primärschlüssel, der automatisch in den Tabellen vergeben wird und die ID des Users, die von Beginn an fix ist, um die Daten zu selektieren oder wieder zu verändern. So wäre da mein grundsätzlicher Gedankengang.

Ist das so korrekt?

Meines Erachtens bläht sich das ganze nämlich gewaltig auf. Bei jeglicher Veränderung müssten über SELECT mindestens drei Primärschlüssel abgefragt werden, noch bevor sich ein Datensatz eindeutig identifizieren lässt.

Was mache ich da falsch?

Moin moin!

Hallo zusammen,

ich hoffe, dass ich hier im PHP-Forum richtig bin, obwohl die
Frage auch auf MySQL abzielt.

Wird schon passen :smile:

Es geht um eine Grundsätzliche Vorgehensweise, wie Daten
gespeichert werden sollen, die über eine PHP-Maske eingegeben
werden.

[…]

Ich habe leider nicht viel Ahnung von Datenbanken. Mir ist
klar was der Primärschlüssel, Fremdschlüssel, Normalisierung
etc. ist. Aber ich weiß nicht wie viel Arbeit in Bezug auf die
Datenverwaltung ich der Datenbank überlassen muss, und wie
viel ich PHP überlassen muss.

Das kommt vor Allem auf den Anwendungsfall an und kann in den seltensten Fällen pauschalisiert werden. Für eine einfache Datenverwaltung reicht es meiner Meinung aber aus, wenn man der Datenbank lediglich die fertigen INSERTs übergibt, statt mit vordefinierten Queries zu arbeiten, aber auch der persönliche Geschmack des Programmierers spielt hier eine Rolle :smile:.

In meinem Fall bekommt jeder User, der sich in das
PHP-Programm einloggt eine Benutzer-ID, die als
Primärschlüssel dient. Damit werden dann auch seine Daten
gespeichert und identifiziert.

Das ist auch gut so, dass mit numerischen IDs gearbeitet wird. Das minimiert die Speicher-Last und maximiert die Geschwindigkeit beim Vergleich mehrerer Tabellen mit Fremdschlüsseln (Texte zu vergleichen braucht einfach länger, als das selbige mit Zahlen zu tun).

Doch wie geht das nun künftig mit weiteren Daten, wie
Kundendaten, Vertragsdaten etc.? Wird ein Vertrag erfasst, so
bekommt dieser einen Primärschlüssel über auto_inkrement
zugewiesen. Damit dieser Vertrag dann auch dem Betreuer und
dem Kunden zugewiesen werden kann, muss in der Vertragstabelle
die Benutzer-ID des User hinterlegt sein und eine
Kundennummer, die wiederum aus einer Kundentabelle hervorgeht.
Ich benötige also immer einen Primärschlüssel, der automatisch
in den Tabellen vergeben wird und die ID des Users, die von
Beginn an fix ist, um die Daten zu selektieren oder wieder zu
verändern. So wäre da mein grundsätzlicher Gedankengang.

Ist das so korrekt?

Ich denke, dass du das schon im Kern ganz gut erfasst hast. Grundsätzlich gibt es zwei Möglichkeiten, die gängig sind, was die Verknüpfung unterschiedlicher Datensätze angeht:

a) Man legt je eine Tabelle für die jeweiligen Datensätze an, in der jeweils eine feste ID vergeben wird (Zahlenwert imt Auto-Increment). Zusätzlich legt man dann eine weitere Tabelle für die Verknüpfung an, in der zwei Felder ebenfalls mit Zahlenwerten stehen. Je Datensatz (bestehend aus den beiden Zahlen) ist dann die Zusammensetzung: IDTabelle1:IDTabelle2. Somit wird über diese „dritte“ Tabelle der eine Datensatz mit dem Anderen verknüpft.

b) Man legt ein Feld in der jeweiligen Tabelle als Fremdschlüssel an und trägt dort die entsprechende ID des zu verknüpfenden Datensatzes ein.

Hier hat a) den Vorteil, dass es eine n:m-Beziehung zwischen den Datensätzen ermöglich, b) hingegen lediglich 1:n. Nachteil ist dafür, dass man bei a) einen weiteren JOIN setzen muss, was bei hohem Datenaufkommen die Last des Servers (wenn auch nur minimal) erhöht. Dafür lassen sich über diese Form aber alle Konstellationen von Verknüpfungen abbilden.

Wichtig ist vor Allem die Verwendung von Indizes auf Fremdschlüssel, um die Suche für die Datenbank zu optimieren. Geschwindigkeitsmäßig nehmen sich die beiden Varianten nur bedingt etwas.

Meines Erachtens bläht sich das ganze nämlich gewaltig auf.
Bei jeglicher Veränderung müssten über SELECT mindestens drei
Primärschlüssel abgefragt werden, noch bevor sich ein
Datensatz eindeutig identifizieren lässt.

Was mache ich da falsch?

Es bläht die Datenbank zwar ein wenig auf, aber das lässt sich anders nunmal kaum lösen. Über einen numerischen Schlüssel zu arbeiten ist schon die kleinste Möglichkeit was den Speicherverbrauch angeht. Wenn man ein entsprechendes Objekt zur Datenbank-Verwaltung nutzt nimmt einem dieses aber oftmals viel Arbeit ab. Dafür muss man einfach mal die verschiedenen Frameworks durchforsten, dann findet man oftmals etwas, was einen sehr einfach mit der Datenbank umgehen lässt.

Ich hoffe, dass das ein wenig hilft?!

MfG
Lutz

Meines Erachtens bläht sich das ganze nämlich gewaltig auf.
Bei jeglicher Veränderung müssten über SELECT mindestens drei
Primärschlüssel abgefragt werden, noch bevor sich ein
Datensatz eindeutig identifizieren lässt.

nein, ein vertrag ist ueber seinen primärschlüssel eindeutig identifizierbar. er ist anhand dessen nicht einem bestimmten mitarbeiter zuzuordnen, was dir aber zur änderung des vertrages egal sein muss.

Hallo,

nein, ein vertrag ist ueber seinen primärschlüssel eindeutig
identifizierbar. er ist anhand dessen nicht einem bestimmten
mitarbeiter zuzuordnen, was dir aber zur änderung des
vertrages egal sein muss.

ok, dann hat der Vertrag in seiner Tabelle einen eindeutigen Primärschlüssel, ist aber an mit einem Fremdschlüssel mit der Mitarbeitertabelle verbunden, oder?

Gruß

nein, ein vertrag ist ueber seinen primärschlüssel eindeutig
identifizierbar. er ist anhand dessen nicht einem bestimmten
mitarbeiter zuzuordnen, was dir aber zur änderung des
vertrages egal sein muss.

ok, dann hat der Vertrag in seiner Tabelle einen eindeutigen
Primärschlüssel, ist aber an mit einem Fremdschlüssel mit der
Mitarbeitertabelle verbunden, oder?

ja, haette ich so gesagt.

Sorry, noch eine Frage :smile:
Hallo nochmal,

b) Man legt ein Feld in der jeweiligen Tabelle als
Fremdschlüssel an und trägt dort die entsprechende ID des zu
verknüpfenden Datensatzes ein.

ist es dann bei dieser Variante möglich viele Fremdschlüssel in einer Tabelle einzusetzen? Also nicht zur Fremdschlüssel in einer Spalte aus einer Tabelle, sondern Fremdschlüssel in vier oder fünf Spalten aus vier oder fünf Tabellen?

Gruß

Moin!

Die Begrenzung gibt allenfalls das verwendete Datenbank-System vor, aber ich denke, dass die Beschränkung - so denn überhaupt eine besteht - sicherlich ausreichend ist um für jede weitere Tabelle einen Fremdschlüssel anzugeben. Also kurz und knapp: Ja, das geht.

Aber vorsicht: Achte bitte auf den Anwendungsfall, es macht nicht in allen Fällen Sinn das so zu handhaben!

MfG
Lutz