Frage zu Datenbankmodellierung

kossy

Bekanntes Mitglied
Hallo zusammen !

Hi Folks !

Ich habe mal eine Frage an euch zu dem Thema Datenbanken. Eigentlich sind es eher gesagt sogar vier ;-)

1. Ist es eigentlich möglich, dass man einen Primärschlüssel in einer Datenbanktabelle nur mit Buchstaben oder auch einem Mix aus Buchstaben versehen kann und dürfen diese dann auch nciht doppelt vorkommen?

2. Werde doppelte Primärschlssel nur berücksichtigt und geblockt, wenn ich die Datenbanktabellen mit Beziehungen versehe und Refentielle Integrität aktiviert habe?

3. Wie genau werden eigentlich in modernen Anwendungen Passwörter von Benutzern hinterlegt und gespeichert (welchen Datentyp hätte dann die entsprechende Zeile in einer Datenbanktabelle)?

4. Wie genau kann ich Zugriffsrechte für Benutzer auf bestimmte Tabelle festlege und so den Benutzer in seinen Ausführungen restriktiver gestalten?

Danke für eure Hilfestellungen !
 

California

Aktives Mitglied
Hallo Kossy,

1. der Primärschlüssel kann beliebige Typ(en) haben- CHAR, VARCHAR, INT,usw, es geht alles ausser BLOBS und CLOBS (Einträge mit unbegrenzter Länge) Der Primärschlüssel muss nicht aus einem Feld bestehen, sollte aber. Am Besten- für spätere Referenzen- nimmst Du ein "autogeneriertes" Integerfeld- d.h. jeder Satz bekommt dann automatisch einen Integer- Wert immer um 1 erhöht als PK. In der Anwendung solltest Du den PK verbergen, er wird immer (so machen wir's) nur programmintern für Referenzen, zum Ändern und Löschen verwendet. Neben dem PK kannst Du ja beliebig viele EINDEUTIGKEITS-Bedingungen vereinbaren, wenn Du das brauchst. Da sind dann Deine "gemischten" Keys bestens aufgehoben, ich nehme an, Du meinst sowas wie einen Menschenlesbaren Code.

2. Primärschlüssel sind IMMER eindeutig (sonst wären sie keine), unabhängig, ob Du darauf nochmal referenzierst oder nicht.

3. Passwörter kann man verschlüsseln (siehe Crypt..) und dann auch als String hinterlegen.

4. Das macht man mit Datenbankrollen - das sind sowas wie Benutzergruppen in Windows. Ein Benutzer bekommt eine Rolle zugeordnet, in der Rolle sind die Zugriffsrechte definiert (welche Tabellen er lesen, schreiben, löschen, ändern bzw. auch strukturell bearbeiten darf)

Gruß Stephan
 
M

Marcinek

Gast
1. Ist es eigentlich möglich, dass man einen Primärschlüssel in einer Datenbanktabelle nur mit Buchstaben oder auch einem Mix aus Buchstaben versehen kann und dürfen diese dann auch nciht doppelt vorkommen?

Genau.

2. Werde doppelte Primärschlssel nur berücksichtigt und geblockt, wenn ich die Datenbanktabellen mit Beziehungen versehe und Refentielle Integrität aktiviert habe?

Nein. Es muss lediglich ein Primärschlüssel sein. PKs haben i.d.r. keine referenzielle Integritätseigenschaft. Es sei den sie sind auch FK (Foraign keys) aber das hat nix mit ihrer Eigenschaft der eindeutigkeit zu tun.

3. Wie genau werden eigentlich in modernen Anwendungen Passwörter von Benutzern hinterlegt und gespeichert (welchen Datentyp hätte dann die entsprechende Zeile in einer Datenbanktabelle)?

MD5 hashwert eines Strings => varchar(255)

4. Wie genau kann ich Zugriffsrechte für Benutzer auf bestimmte Tabelle festlege und so den Benutzer in seinen Ausführungen restriktiver gestalten?

Dies hängt von der Datenbank ab. Google nach table rights <db name>.
 

stareagle

Mitglied
Hallo,

zu den anderen Fragen wurde ja schon genug gesagt, aber zu den Passwörtern gebe ich noch mal meinen Senf dazu.

Hallo zusammen !

3. Wie genau werden eigentlich in modernen Anwendungen Passwörter von Benutzern hinterlegt und gespeichert (welchen Datentyp hätte dann die entsprechende Zeile in einer Datenbanktabelle)?

Passwörter sollten nicht im Klartext gespeichert. Üblicherweise speichert man nur den Hashwert des Passwortes. Dazu sollte man aber auch einen sicheren Hash-Algorithmus verwenden. MD5 gilt mittlerweile als unsicher, ebenso wie SHA-1. SHA-256 und SHA-512 dürften die sichersten sein. Wenn man wirklich richtig machen will, fügt man an die Passwörter noch ein zufallsgeneriertes Salt an, und speichert den Hash-Wert von Passwort mit angehängtem Salt und das Salt. Damit machst du es einem potentiellen Angreifer so schwer wie möglich. In der DB legt man das wieder als String ab. Mehr zum Salt kannst du hier nachlesen: Salt in der Wikipedia

Wenn sich ein Benutzer anmeldet, berechnet man den Hash-Wert des Passwortes, das er eingegeben hat, und vergleicht ermittelten Hash-Wert mit dem gespeicherten Hash-Wert.

Beste Grüße

Stareagle
 

Tobse

Top Contributor
MD5 hashwert eines Strings => varchar(255)
Hier muss ich noch was anhängen. Ein MD5 (oder sha-x...) hashwert liefert eine 32-Stellen langen String, der eine Hexadezimalzahl darstellt. Für Hashwerte (egal ob mit salt oder ohne) sind also die Datentypen VARCHAR(32) oder INT(16) empfehlenswert. Sonst hast du pro user 223 bytes ( = 255-32) ungenuzten speicherplatz. Das mag wenig aussehen, aber kleinvieh macht auch mist.
 
M

Marcinek

Gast
Ja prinzipiell hast du recht.

Aber bei varchar wäre das egal, da nur so viel speicher reserviert wird, wieviel benötigt wird. variabel eben.

Und ja statt md5 würde man sha2 nehmen.
 

kossy

Bekanntes Mitglied
Hallo Leute !

Vielen Dank nochmal für die Hilfe !

Eine Frage hätte ich aber doch noch mal an euch: Wann genau macht es wirklich in einer relationalen Datenbank Sinn, einen oder mehrere Spalten gleichzeitig als Primärschlüssel und Fremdschlüssel zu kennzeichnen bzw. wann ist das sogar unumgänglich?

Grüße
Kossy
 
M

Marcinek

Gast
z.B. in einer Intersection table.

Dann hast du key_table_1 und key_table_2 als zusammengesetzteb PK.

Für OR-Mapping ist das unumgänglich.
 

Evil-Devil

Top Contributor
Er meint eine Tabelle die nichts anderes macht als Schlüssel miteinder zu verbinden. Zb. wenn du N zu M Beziehungen hast und die irgendwo hinterlegen willst machen jene Tabellen, auch Kreuztabellen genannt, am meisten Sinn.
 

kossy

Bekanntes Mitglied
Hallo Leute !

Danke nochmal für eure Beiträge !

Ich habe mal einen SQ Code wie diesen hier gesehen und wollte mal von euch als Profis hören, ob das ein guter oder schlechter Code ist.

Code:
SELECT *
FROM Tab1 INNER JOIN Tab2
INNER JOIN Tab3
INNER JOIN Tab4
ON Tab1.FeldA = Tab2.FeldA
ON Tab1.FeldA = Tab3.FeldA
ON Tab3.FeldB = Tab4.FeldB


Müsste man nicht eigentlich zwischen jeden INNER JOIN auch gleich die enstprechende ON Klausel hinzufügen?

Grüße
Kossy
 

Evil-Devil

Top Contributor
Abgesehen davon das ich es nicht sonderlich lesbar finde, kann es ok sein. Hätte das wie folgt geschrieben.

[sql]
SELECT *
FROM Tab1
INNER JOIN (Tab2, Tab3, Tab4)
ON (Tab1.FeldA = Tab2.FeldA
AND Tab1.FeldA = Tab3.FeldA
ANDTab3.FeldB = Tab4.FeldB)[/sql]

Allerdings sollte das * weg. Es ist sehr schlecht * zu schreiben, am besten immer genau die Felder angeben die man ausgegeben haben will. Alles andere ist nur unnötiger Ballast für das DBMS.
 

kossy

Bekanntes Mitglied
Hallo nochmal an euch !

Kann mir vielelicht jemand von euch sagen, wo ier ein Syntaxfehler in meinem SQL Code vorliegt? Das ist zwar mit Basci geschrieben, sollte aber in diesme fall gleichgültig sein. Vielen Dank nochmal für eure Hilfe !

Code:
strSql = "SELECT tbl301_37_ZsStruktur.ZsStruktur_GueltigAb, tbl301_37_ZsStruktur.ZsStruktur_GueltigBis, " & _
                    "tbl301_38_ZsStrukturDetails_TMP.Ebene, tbl301_38_ZsStrukturDetails_TMP.KumSpalte, " & _
                    "tbl301_38_ZsStrukturDetails_TMP.Gruppe, tbl301_38_ZsStrukturDetails_TMP.ZsStruktur_ID, " & _
                    "tbl301_38_ZsStrukturDetails_TMP.ZS_ID, tbl301_38_ZsStrukturDetails_TMP.Parent_ZS_ID, " & _
                    "tbl301_21_Zahlungsstroeme.ZS_Bez, tbl301_21_Zahlungsstroeme.ZS_Bez_Kurz, " & _
                    "tbl301_38_ZsStrukturDetails_TMP.Sort, tbl301_38_ZsStrukturDetails_TMP.BAS_SpalteNr " & _
             "FROM tbl301_38_ZsStrukturDetails_TMP INNER JOIN tbl301_37_ZsStruktur " & _
                    "ON tbl301_38_ZsStrukturDetails_TMP.ZsStruktur_ID = tbl301_37_ZsStruktur.ZsStruktur_ID " & _
                  "INNER JOIN tbl301_21_Zahlungsstroeme " & _
                    "ON tbl301_38_ZsStrukturDetails_TMP.ZS_ID = tbl301_21_Zahlungsstroeme.ZS_ID " & _
             "WHERE tbl301_38_ZsStrukturDetails_TMP.ZS_ID = " & lngZs_Id & " AND " & _
                   "tbl301_38_ZsStrukturDetails_TMP.ZsStruktur_ID = " & lngIDZsStruktur
 

Tobse

Top Contributor
Also das ganze mal im klartext:
Code:
SELECT
	tbl301_37_ZsStruktur.ZsStruktur_GueltigAb,
	tbl301_37_ZsStruktur.ZsStruktur_GueltigBis,
	tbl301_38_ZsStrukturDetails_TMP.Ebene, tbl301_38_ZsStrukturDetails_TMP.KumSpalte,
	tbl301_38_ZsStrukturDetails_TMP.Gruppe, tbl301_38_ZsStrukturDetails_TMP.ZsStruktur_ID,
	tbl301_38_ZsStrukturDetails_TMP.ZS_ID, tbl301_38_ZsStrukturDetails_TMP.Parent_ZS_ID,
	tbl301_21_Zahlungsstroeme.ZS_Bez, tbl301_21_Zahlungsstroeme.ZS_Bez_Kurz,
 	tbl301_38_ZsStrukturDetails_TMP.Sort, tbl301_38_ZsStrukturDetails_TMP.BAS_SpalteNr
FROM
	tbl301_38_ZsStrukturDetails_TMP INNER JOIN tbl301_37_ZsStruktur
    ON
		tbl301_38_ZsStrukturDetails_TMP.ZsStruktur_ID = tbl301_37_ZsStruktur.ZsStruktur_ID
INNER JOIN
	tbl301_21_Zahlungsstroeme
	ON
		tbl301_38_ZsStrukturDetails_TMP.ZS_ID = tbl301_21_Zahlungsstroeme.ZS_ID
WHERE
		tbl301_38_ZsStrukturDetails_TMP.ZS_ID = 0
	AND
		tbl301_38_ZsStrukturDetails_TMP.ZsStruktur_ID = 0
Ganz spontan fällt mir nur auf, dass die zahlen keine ' haben, aber ob die wirklich nötig sind, weiss ich nicht. Die Fehlermeldung von der Datenbank wäre da schon ganz hilfreich.
 

kossy

Bekanntes Mitglied
Hallo !

Ich habe einen Syntaxfehler in der From Klausel ausgegeben bekommen, angeblich soll dort irgendein Operator fehlen . Ich erhielt die Meldung "Fehlender Operator in der der From Klausel".

Diesen sehe ich aber nicht.

Gruß
Kossy
 

turtle

Top Contributor
Ich schlage vor, den SQL-Befehl mal in einem JDBC-Client (wie zum Beispiel Squirrel) zu probieren.

dann kannst Du dich auch dem Befehl schrittweise nähern, bis es Fehler hagelt oder Du zufrieden bist;)

Dieses Zusammenbasteln eines SQL-Befehls über Strings halte ich ehe für Nonsens. Das kann man besser/lesbarer mit PreparedStatements machen (mit dem Befehl, den Du in Squirrel getestet hast)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Frage zu Bundesliga-DB Datenbankprogrammierung 1
pkm Frage zu Encodingproblem bei einer Datenbankanbindung Datenbankprogrammierung 1
B Frage bei einer SQL Query Datenbankprogrammierung 3
B Frage zu Datenbank Design bei Events (ZenDesk) Datenbankprogrammierung 1
B SQLite Frage zu SQLite Datenbankverbindung Datenbankprogrammierung 7
M Frage zu JSON Datenbankprogrammierung 16
Psypsy Hibernate / JPA OneToOne MappedBy Frage Datenbankprogrammierung 2
P Frage zu Connection.close() Datenbankprogrammierung 4
R MySQL Frage zum Anlegen von Artikeln inkl. Verbindungen Datenbankprogrammierung 0
M Grundlegende Klassen-Design Frage Datenbankprogrammierung 0
P MySQL Frage zur Einbindung in ein Java Projekt Datenbankprogrammierung 2
I Frage zu Datenmodellierung Datenbankprogrammierung 3
J Normalisierung - Allgemeine Frage zur 3. Normalform (Eventuelle Abhängigkeit) Datenbankprogrammierung 4
F Normalisierung Datenbank Frage Datenbankprogrammierung 5
J Frage zu ResultSet Datenbankprogrammierung 3
W Frage zur Datenbankwahl bei Umstieg auf Java Datenbankprogrammierung 7
D Frage zu DISTINCT in SQL Datenbankprogrammierung 5
K Frage zur Datenprotokollierung bei DML Anweisungen Datenbankprogrammierung 3
K Frage zu SQL Datenbankprogrammierung 2
L PostgreSQL Hibernate-Frage Datenbankprogrammierung 2
D Generelle Frage zum Umgang mit Datensätzen Datenbankprogrammierung 5
L Frage zu UpdateQuery Datenbankprogrammierung 12
8 MySQL Kurze Frage zur Sicherheit Datenbankprogrammierung 9
D Frage zu INSERTS über mehrere Datenbanktabellen Datenbankprogrammierung 3
D Frage zu Ausführungsmöglichkeiten von SQL Befehlen Datenbankprogrammierung 13
D Frage zu SQL Syntax Datenbankprogrammierung 17
D Frage zu potenziellen Leerzeichen in einer Datenbank Datenbankprogrammierung 5
X Connection schließen oder speichern? Performance Frage Datenbankprogrammierung 7
J mal wieder eine Frage zu parallelen Transaktionen.. Datenbankprogrammierung 2
V Frage zu Hibernate-Mapping Datenbankprogrammierung 11
N Allg. Frage zur Datenbankverbindung Datenbankprogrammierung 2
E einfache Frage bei DB-Zugriff Datenbankprogrammierung 11
S MySQL Frage zu LeftJoin Abfrage Datenbankprogrammierung 2
O eigentlich simple SQL Frage Datenbankprogrammierung 2
M Frage zu folgender Query in EJB-QL Datenbankprogrammierung 4
H JBoss: Frage zur Datasource in der ...-ds.xml Datenbankprogrammierung 4
F Frage zu Prepared Statement Datenbankprogrammierung 2
R hibernate Frage zu configFile-Pfad und Groß/Kleinschreibung von Postgres-Tabellen Datenbankprogrammierung 8
U Frage zum Erfassen von hinzufügten und entfernten Objekten Datenbankprogrammierung 9
M prinzipielle Frage zu Datenbanken und jars ... Datenbankprogrammierung 2
S Hibernate - spezielle Frage, n zu n Beziehung Datenbankprogrammierung 11
R Frage zu PreparedStatement/ResultSet Datenbankprogrammierung 16
J Frage zu Synchronisation bei parallelem Zugriff, speziell mit JPA Datenbankprogrammierung 2
F EclipseLink persistence.xml Frage Datenbankprogrammierung 11
N Frage zur Sicherheit von Konfigurationsdatei Datenbankprogrammierung 4
H performance frage Datenbankprogrammierung 9
G Frage zum Insert-Statement Datenbankprogrammierung 2
Antoras Design-Frage: Datenzuordnung zu verschiedenen Accounts Datenbankprogrammierung 2
T HSQL: verständnis Frage Datenbankprogrammierung 2
T Java JPA Frage bzgl. DISTINCT Datenbankprogrammierung 2
G Frage zu connection? Datenbankprogrammierung 9
A Frage zu SQL-Abfrage Datenbankprogrammierung 2
G Frage zu SQL "WHERE IN (1, 2, 3. , N)" Datenbankprogrammierung 8
G Allgemeine Frage zu Datenbanklimits Datenbankprogrammierung 27
G allgemeine JDBC-Connection Frage Datenbankprogrammierung 2
G Frage zu Hibernate und M:N Beziehung Datenbankprogrammierung 9
K HQL Frage Datenbankprogrammierung 10
D kurze Frage zu einem Query Datenbankprogrammierung 6
B Hibernate mit MySql - Verständniss Frage Datenbankprogrammierung 8
N Kleine Frage zu Connection Pooling mit DataSource Datenbankprogrammierung 2
T Update-Frage Datenbankprogrammierung 11
E SQL-Frage (Löschen aller Datensätze) Datenbankprogrammierung 9
P Frage zu Performancetest einer Datenbank Datenbankprogrammierung 3
W Frage zum Umgang mit DB-Daten Datenbankprogrammierung 2
E Nochmal eine Datenbankabfrage Frage :-o (JOIN oder so) Datenbankprogrammierung 4
P frage zu "" bei INSERT STATEMENTS Datenbankprogrammierung 2
K frage zum ausführen eines INSERT statements Datenbankprogrammierung 16
L frage zu mySQL Datenbankprogrammierung 4
C Mal ne Frage an die Experten Datenbankprogrammierung 4
G Frage zum Datenbankdesign Datenbankprogrammierung 5
J DB Verbindung Design Frage Datenbankprogrammierung 5
M Datenbankanbindung in Java : Newbie-Frage Datenbankprogrammierung 2
U Grundsätzliche Frage Datenbankprogrammierung 4
S Frage zu INSERT Datenbankprogrammierung 2
X Wieder mal ne Frage ... Datenbankprogrammierung 15

Ähnliche Java Themen

Neue Themen


Oben