Personenregister mit Drupal erstellen (große Datenmenge)
am 04.08.2010 - 13:07 Uhr in
Hallo,
ich habe schon ein wenig gegoogelt und habe leider noch keine Lösung gefunden. Folgendes: Wir wollen ein Personenregister mithilfe von Drupal erzeugen. Eine geschlossene Nutzergruppe soll auf die Telenummern zurückgreifen können und diese auch unter Datenschutzgründen (daher Drupal, da hier sehr(!) gute Rechteverwaltung) sortieren können. Die Daten der Personen liegen als CSV-Datei (Nachname, Vorname, Telenummer, etc.) vor. Da der Schwerpunkt ausländische Mitbürger sind, können auch "nichteuropäische" Sonderzeichen vorkommen. Also, quasi ein riesiges großes Multikulti-Adressbuch ...
Meine Gedanken:
Ich importiere die CSV-Datei in Drupal und jeder Datensatz wird zu einem neuen Konto der Gruppe "Telebucheintrag". Mithilfe von Views und der Rechteverwaltung lässt sich so der Datenschutz problemlos einhalten. Auch können Daten leicht über die Admin-Oberfläche geändert werden. Nachteil: Doppelte Einträge können schlecht aufgespürt werden. Auch kann es zu Problemen bei einem erneuten Einlesen der CSV-Datei kommen, wenn Persondaten mit Drupal geändert wurden, aber in der CSV-Datei noch als ursprüngliche Daten vorhanden sind. Diese lassen sich schwer filtern. Daher wird es darauf hinauslaufen, dass wohl jede Datenänderung nur(!) in der CSV-Datei erfolgt und die CSV-Datei immer neu eingelesen wird und alle Daten in der Drupal-Datenbank überschreibt (also besser keine Benutzerkonten, sondern nur per Views lösen). Hier einen intelligenten Workflow zu entwickeln traue ich mir zu, dennoch interessiert mich auch dazu eure Meinung.
Mein großes Problem: Performence
Es liegen etwas mehr als 100.000 Datensätze vor. Teils mit sehr kryptischen Namen, teils mit Vokalen mehrere ASCII-Codes. Die ASCII-Codes werden wohl nicht das Problem, aber die Performence ... Drupal kann ich gut administrieren, aber bei einer MySQL-Optimierung habe ich noch große Lücken.
==> Ich habe im Internet gelesen, dass die MySQL-Perfomence bei dieser Datenmenge durch Indizes bzw. Indexe verbessert wird. Hm ... WIe kann ich mir das in der Praxis vorstellen? Was muss ich mit Drupal machen, um den Adressdaten die benötigten Index zuzuweisen?
==> Auch habe ich gelesen, dass die Anzahl der Spalten in der MySQl-Datenbank entscheident für die Performence ist. Also, ich sollte wohl neben der Drupal-eigenen Datenbank eine extra Datenbank für die Adressen anlegen und dort so wenig Spalten wie möglich anlegen. Wie kann ich das machen (zweite Datenbank in Drupal einbinden, diese Datenbank auch schützen)? Wie kann ich dieser zweiten Datenbank Views und Nodes zuweisen, um sie zu manipulieren?
Vielen Dank fürs Lesen!
- Anmelden oder Registrieren um Kommentare zu schreiben
Ausprobieren
am 22.08.2010 - 15:36 Uhr
Nimm Dir doch mal das Modul Devel und generiere die Anzahl der geplanten User. Es gibt
auch in Devel eine Möglichkeit die Performance zu testen. Dann hast Du eine bessere Aussage
über die Perfomance. Besonders bei der Suche.
Bei mysql muss die Kolation auf utf8-bin stehen, um auch Umlaute ohne Probleme ablegen zu
können.
Wenn Du es auslagern willst, kannst Du Dir ja mal openldap ansehen und Deine Benutzerverwaltung
darüber laufen lassen. openldap ist extra für schnelle Zugriffe bei großen Datenmengen ausgelegt.
Gruss
Katsun
Eigene Tabellen und Zugriff per PHP-code
am 12.08.2010 - 13:40 Uhr
Du bringst ein paar Sachen durcheinander: MySQL (wie jede andere SQL-DB auch) verwaltet Daten in Tabellen, welche aus einzelnen Spalten (eigtl. Feldern) aufgebaut sind. Drupal legt eine bestimmte Anzahl solcher Tabellen in einer Datenbank an und nutzt von selbst auch nur diese. Du kannst also problemlos eigene Tabellen nach einem eigenen Schema anlegen ohne damit Drupal zu stören. In Drupal selbst kannst du mittels ein bisschen PHP-Code auf diese Tabellen zugreifen und Daten auslesen. Für den Import der csv-Datei empfiehlt sich entweder ein externes Programm oder du schreibst wieder in Drupal ein paar PHP-Befehle, die die Datei verarbeiten. Wohl gemerkt: alles ausserhalb der Drupal-internen DB-Zugriffe.
Die Optimierung der DB kannst du dann so weit tunen wie es dir möglich ist, durch anlegen von Indizes (sehr empfehlenswert), Schlüsseln und ähnlichem. Dazu solltest du mal die MySQL Dok anschauen, da gibt es einiges, woran man drehen kann. Wenn die Daten bereits "flach" vorliegen (also jede Zeile alle Informationen enthält wie z.b. vollständiger Ortsname etc.) und du auf komplexe Abfragen verzichten möchtest (Stichwort Fremdschlüssel, JOIN etc.), dann lege eine einzelne Tabelle an, die exakt die Struktur der CSV-Daten widerspiegelt. Dann kannst du in einem Rutsch die Tabelle leeren und die neuen Daten einlesen.
Die Tabelle ist dann soweit gesichert, wie der Rest der Datenbank ebenfalls, also alle DB-Nutzer die auf die DB zugreifen dürfen, dürfen auch auf diese Tabelle zugreifen (kann geändert werden, macht aber die Sache nur unnötig komplex). Du musst dir also um die Sicherheit keine größeren Gedanken machen.
Zur Performance: die Spalten (Felder) in einer Tabelle haben natürlich Auswirkungen auf die Performance, aber beim Vorliegen eines Index für die wichtigen Felder spielt das in der genannten Größenordnung keine Rolle. Mach dir Gedanken, wenn du im Bereich von ein paar Millionen Datensätzen operierst, aber bei 100k sollte der Index eigentlich alles auffangen können.