Hallo,
ich habe eine Frage zur Optimierung meiner Datenbankstruktur. Ich arbeite zur Zeit an einer Webapplikation mit Spring, Spring Security und Hibernate. Ich nutze den MySQL Server 5.1.
Ich habe meine Frage auch schon in einem SpringForum gestellt, doch dort riet man mir ein mySQl Forum aufzusuchen.
Folgendes Problem: Als ich vor einem Jahr mit meinem Projekt begann, recherchierte ich den von Spring empfohlenen Aufbau der User und Authorities Tabelle (für den Login). Ich fand folgende Konfiguration:
Diese Konfiguration funktioniert auch, aber heute habe ich mir Gedanken darüber gemacht, die Performance zu verbessern und deshalb IDs zu benutzen. Deshalb habe ich erneut recherchiert und auf einmal bin ich auf die aktuelle(!) von Spring empfohlene Konfiguration gestoßen:
Deswegen habe ich mehrere Fragen: Einmal zum Nutzen der IDs und einmal zu dieser, von meiner abweichenden, Konfiguration:
1. Die Änderungen in der Authorities-Tabelle kann ich doch ignorieren, oder? Ich habe nur jeweils EINE Rolle per Username und es darf keine mehrfachen Einträge für einen usernamen dort geben (primary key). Deshalb brauche ich keine unique indexes, wie in der neuen Konfiguration vorgeschlagen, das sehe ich doch richtig? (Sorry, bin nicht so der Profi :-))
2. Bei Users wurde varchar_ignorecase(50) hinzugefügt. Diese Eigenschaft kann ich für MySQL gar nicht finden, sie existiert dort nicht, richtig? Wenn sich ein User einloggt, macht es bei mir zur Zeit keinen Unterschied, ob man user oder uSer (etc) eintippt. Ich denke, dieses ignorecase sollte das gleiche erreichen, von daher kann ich es sicher auch vernachlässigen?
3. Zu den IDs:
Da es in den Tabellen keine IDs gibt, muss ich in jeder anderen Tabelle, die auf den User verweist, immer den usernamen verwenden. (Zb Userinformation(username, email, ....))
Würde man IDs nehmen, würde dies doch auch die Performance verbessern, oder sehe ich das falsch? Ich könnte mir deshalb vorstellen, dass es Sinn machen würde, die Konfiguration folgendermaßen zu ändern:
der username wäre immer noch unique, aber pk wäre die id. mit dieser könnte man dann in den anderen tabellen arbeiten:
das würde eine menge chars einsparen, würde dies nicht die performance verbessern?
wäre nett, wenn mir jemand antworten würde :-)
im übrigen, ist es nicht auch so, dass sich die performance verbessert, wenn man nicht nur kürzere einträge, sondern auch weniger spalten pro tabelle hat?
ich habe zb für den Geburtstag innerhalb der userinformationstabelle die spalten: day, month und year. Wenn ich sie durch die Tabelle "birthday" (type date) ersetze, würde das die performance verbessern?
vielen Dank für eine Beantwortung meiner Fragen! :-)
ich habe eine Frage zur Optimierung meiner Datenbankstruktur. Ich arbeite zur Zeit an einer Webapplikation mit Spring, Spring Security und Hibernate. Ich nutze den MySQL Server 5.1.
Ich habe meine Frage auch schon in einem SpringForum gestellt, doch dort riet man mir ein mySQl Forum aufzusuchen.
Folgendes Problem: Als ich vor einem Jahr mit meinem Projekt begann, recherchierte ich den von Spring empfohlenen Aufbau der User und Authorities Tabelle (für den Login). Ich fand folgende Konfiguration:
Code:
create table users ( username varchar(50) NOT NULL, password varchar(50) NOT NULL, enabled boolean NOT NULL, primary key(username)) ENGINE=InnoDB; create table authorities ( username varchar(50) NOT NULL, authority varchar(50) NOT NULL, primary key(username), foreign key(username) references users(username) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE=InnoDB;
Code:
create table users( username varchar_ignorecase(50) not null primary key, password varchar_ignorecase(50) not null, enabled boolean not null); create table authorities ( username varchar_ignorecase(50) not null, authority varchar_ignorecase(50) not null, constraint fk_authorities_users foreign key(username) references users(username)); create unique index ix_auth_username on authorities (username,authority);
1. Die Änderungen in der Authorities-Tabelle kann ich doch ignorieren, oder? Ich habe nur jeweils EINE Rolle per Username und es darf keine mehrfachen Einträge für einen usernamen dort geben (primary key). Deshalb brauche ich keine unique indexes, wie in der neuen Konfiguration vorgeschlagen, das sehe ich doch richtig? (Sorry, bin nicht so der Profi :-))
2. Bei Users wurde varchar_ignorecase(50) hinzugefügt. Diese Eigenschaft kann ich für MySQL gar nicht finden, sie existiert dort nicht, richtig? Wenn sich ein User einloggt, macht es bei mir zur Zeit keinen Unterschied, ob man user oder uSer (etc) eintippt. Ich denke, dieses ignorecase sollte das gleiche erreichen, von daher kann ich es sicher auch vernachlässigen?
3. Zu den IDs:
Da es in den Tabellen keine IDs gibt, muss ich in jeder anderen Tabelle, die auf den User verweist, immer den usernamen verwenden. (Zb Userinformation(username, email, ....))
Würde man IDs nehmen, würde dies doch auch die Performance verbessern, oder sehe ich das falsch? Ich könnte mir deshalb vorstellen, dass es Sinn machen würde, die Konfiguration folgendermaßen zu ändern:
Code:
create table users ( id int NOT NULL AUTO_INCREMENT, username varchar(50) NOT NULL, password varchar(50) NOT NULL, enabled boolean NOT NULL, primary key(id), unique(username)) ENGINE=InnoDB;
Code:
create table authorities ( userid int NOT NULL, authority varchar(50) NOT NULL, primary key(userid), foreign key(userid) references users(id) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE=InnoDB;
wäre nett, wenn mir jemand antworten würde :-)
im übrigen, ist es nicht auch so, dass sich die performance verbessert, wenn man nicht nur kürzere einträge, sondern auch weniger spalten pro tabelle hat?
ich habe zb für den Geburtstag innerhalb der userinformationstabelle die spalten: day, month und year. Wenn ich sie durch die Tabelle "birthday" (type date) ersetze, würde das die performance verbessern?
vielen Dank für eine Beantwortung meiner Fragen! :-)
Comment