Ich habe ein mehr oder weniger privates Projekt, welches ich in Java mit “angeschlossener” PostgreSQL-Datenbank verwirklichen möchte. Mehr privat, weil ich daran lernen möchte, und weniger privat, weil ích es in meiner Firma benutzen möchte.
Das Programm soll auf dem Desktop laufen und Mitarbeitereinsätze verwalten.
In diesem Thread möchte ich also die Fragen zum DB-Teil stellen, weil meine Datenbank-Kenntnisse komplett eingerostet sind.
Ich freue mich auf konstruktive Antworten und bedanke mich schon jetzt bei euch für eure Hilfe.
==================================================
Für den Zugang zur Datenbank ist ein Login vorgesehen.
Welche Daten werden für eine Account-Tabelle eurer Meinung nach benötigt?
Habt ihr dahin weitergehende Tipps für mich? Worauf sollte ich achten, etc?
Z.B. wie lang sollten die einzelnen Felder sein?
da du ja ne reine Desktopanwendung machen willst brauchst du ja keine Sachen wie eMail, daher würde ID, Name, PW reichen
Zusätzlich würd ich aber auch noch eine Benutzergruppentabelle machen worüber du die Rechte der User einschränken/ausweiten kannst. Da musst du jedoch noch überlegen ob es eine 1:n oder n:m Beziehung wird.
Bei einer 1:n Beziehung würde noch ein Fremdschlüssel in die user Tabelle kommen für die Gruppe zu der er gehört, bei der n:m Beziehung würde eine Tabelle mit den beiden IDs (User,Gruppe) dazu kommen
Du musst vielleicht noch überlegen was für Infos du zu den Leuten speichern willst wie Personalnummer, Adressen …
Zu beachten hmmm
Naja du solltest möglichst nie klartext Passwörter rumschicken/speichern daher würd ich im Passwort Feld deR Tabelle den MD5 Wert Speichern --> MD5(‘passwort’)
Beim Login musste dann nur den Hash vergleichen.
das waren erstmal so die ersten Ideen die ich hab
hmmm das pw brauch nur 32 Zeichen hab oder 40 (musste mal testen)
als ID würd ich Serial nehmen ( musste dich nicht um die Erhöhung kümmern) bei Verweisen auf die dann immer Integer
beim Namen ist das schon schwieriger ich würd zur Sicherheit 100 nehmen
Ich habe jetzt mal versucht, mit “pgAdmin III” eine Tabelle mit Werten und Schlüsseln zu erstellen. Aber ich komme damit überhaupt nicht klar.
Kann mir jemand eine kurze Anleitung schreiben, wie man Tabellen anlegt?
Ich hab dir im Wiki mal auf die Schnelle was zusammengetippt was dir erstmal helfen könnte http://wiki.byte-welt.net/wiki/CREATE_TABLE_(SQL)
ansonsten hätte ich da noch was einfacheres
http://forum.byte-welt.de/showthread.php?t=324
Das Passwortfeld brauch nur 32 Zeichen lang sein, da der MD5-Hash immer 32 Zeichen lang ist: Also als Datentyp wäre hier CHAR(32) sinnvoll.
Glaube SHA-1-Hashes waren länger, wieviel weiß ich grad nicht … :o
[edit]http://de.wikipedia.org/wiki/Secure_Hash_Algorithm#SHA-1[/edit] 40
Gut Schuß
VuuRWerK
Alles klar, danke erst mal. Das hilft mir schon weiter.
In 14 Tagen kann ich weiter am Projekt arbeiten, jetzt gibts erst mal URLAUB.
[QUOTE=EagleEye]Naja du solltest möglichst nie klartext Passwörter rumschicken/speichern daher würd ich im Passwort Feld deR Tabelle den MD5 Wert Speichern --> MD5(‘passwort’)
Beim Login musste dann nur den Hash vergleichen.[/QUOTE]
Kannst du mir da mal näheres sagen und auch mal ein Codebeispiel zeigen?
das einfachste Beispiel
[sql]SELECT MD5(‘einganzgeheimespasswort’);[/sql]
beim Einfügen kannste es auch so machen
[sql]INSERT INTO tabelle (benutzer,pw) VALUES (‘du’,MD5(‘deingeheimespw’);[/sql]
Login dann einfach so
[sql]SELECT * FROM tabelle WHERE benutzer = ‘du’ AND pw = MD5(‘deingeheimespw’);[/sql]
Fehlt beim 2. Beispiel eine schließende Klammer?
Ich bin jetzt dabei, mit EagleEyes in der Entwicklung befindlichen DBDesigner, die Datenbank aufzubauen.
Ich habe Mitarbeiter die einen Einzel-Account haben und Mitarbeiter, die sich einen Sammel-Account teilen. Einzelbenutzer werden mehr Rechte bekommen, Sammelbenutzer wahrscheinlich nur lesen. Wie teile ich das in Tabellen auf und wie müssten die Relationen/Kardinalitäten aussehen?
Ein Mitarbeiter hat einen Account und gehört einer Benutzergruppe an.
Da fehlt mir jetzt eine ordentliche Verbindung.
Wie könnte ich das mit den Rechten regeln?
das mit den Rechten würde ich über die Benutzergruppe regeln
Jede Gruppe hat bestimmte Rechte die über Einträge geregelt sind, z.b.
Tabelle Benutzergruppen -> id, name, kannx, kanny kannz
so kannst du das auch erweitern ohne das dir was kaputt geht
zwischen Sammelbenutzern und normalen Einzelbenutzern würd ich nicht oder nur durch ein kleines Flag in der Account Tabelle unterscheiden.
Die Beziehungen würde ich so machen
Mitarbeiter <–M 1 ----> Account, weil ein Mitarbeiter kann einen Account haben, aber ein Account kann zu einem oder mehreren Mitarbeitern gehören
Account <—M 1—> Gruppe, oder auch M:N wie du es machen willst hängt von dir ab,ein Account kann in einer Gruppe sein( oder mehreren) und eine Gruppe enthält mehrere Accounts
[QUOTE=EagleEye]Jede Gruppe hat bestimmte Rechte die über Einträge geregelt sind, z.b.
Tabelle Benutzergruppen → id, name, kannx, kanny kannz
so kannst du das auch erweitern ohne das dir was kaputt geht[/quote]
Klingt nicht schlecht. Ich verstehe nur nicht, was z.B. in der Tabelle dann drin stehen könnte. Kannst du mal einen Beispiel-Tupel (Tabellenzeile) posten?
Also, ein Benutzer hat einen Account. Wenn ein Account nun durch mehrere Benutzer genutzt wird ist das OK. Also brauche ich auch kein Flag zu setzen.
OK, leuchtet ein, werde ich so machen.
Hmm, es genügt mir, wenn ein Account zu einer Gruppe gehört, der Benutzer erhält dann die Rechte anhand seiner Benutzergruppen-Zuteilung.
Wäre das so OK?
naja das da oben war eigentlich schon ein Beispiel
ich hab in meinem Projekt zb das hier
[sql]INSERT INTO t_user_groups(id_group, name, description, create_accounts, create_customers, edit_pages, delete_pages, change_tree )
VALUES (0, ‘Administrator’, ‘Administratoren mit allen Rechten’, TRUE, TRUE, TRUE, TRUE, TRUE );
[/sql]
Genau das ist es, was ich noch nicht ganz nachvollziehen kann. Wofür stehen jeweils die boolean-Werte? Was setzt du damit zusammen?
na das sind die einzelnen Rechte die diese Gruppe hat
Ein Benutzer kann z.B. neue Accounts anlegen oder er darf Sachen löschen
Alles klar, habs kapiert.
So, die Datenbank steht nun erstmal. Vielleicht muss ich noch Kleinigkeiten ändern, aber ich denke erstmal gehts so.
In der DB gibts eine Tabelle Accounts, in der ich alle Benutzerkonten anlegen möchte. Die Felder darin sind acc_id, name, pass, und als Fremdschlüssel auf eine weitere Tabelle Usergroup, ein Feld namens group_id.
Nun möchte ich einen Benutzer anmelden und testen, ob er überhaupt einen Account hat und wenn ja, welcher Benutzergruppe mit welchen Rechten er angehört. Die Rechte sind in Form von Feldern des Typs boolean angelegt. So sind sie erweiterbar und ich kann so beliebige Rechtekonstellationen anlegen.
Anhand der ermittelten Rechte möchte ich dann das GUI zusammenstellen.
Nun die Frage: Wie müsste die SQL-Anweisung dafür aussehen?
ich habs erstmal so gemacht
[sql]
SELECT id FROM accounts WHERE name = ‘eingegebenername’ AND pass = MD5(‘passwort’);
[/sql]
wenns ein Ergebnis zurückgibt war der Login erfolgreich wenn nicht dann nicht
wenn du gut bist überprüfst du auch obs mehrere Ergebnisse gab, weil dann ist was faul.
Wenn das dann geklappt hat würde ich alle Daten laden
[sql]
SELECT a.name AS name, g.recht1 AS recht1, … FROM accounts a, usergroup g WHERE a.acc_id = … AND a.group_id = g.group_id;
[/sql]
Das AS … mach ich immer weil ich dann genau weiß wie die Spalte heißt und ich mit ResultSet.getString(“spaltenname”); darauf zugreifen kann
Bei jeder Abfrage auf die Datenbank inder du Variablen setzt z.B. ID, Name usw solltest du immer ein PreparedStatement nehmen (Falls ich es dir noch nicht gesagt habe)