In vielen relationalen Datenbankdesigns gibt es Felder, auf die in anderen Tabellen verwiesen wird.
Betrachten Sie beispielsweise eine Benutzertabelle mit einem eindeutigen Benutzernamen und einer zweiten Tabelle, in der Adressdaten gespeichert sind.
Ein mögliches Layout, das ich sagen würde, ist der übliche Ansatz, den ich in den meisten Programmen beobachtet habe, die Verwendung von Auto-Inkrement-IDs wie folgt:
Table users
===========
userId int primary auto_increment
userName varchar unique
Table adressdata
==========
userId int references users.userId
adress_type varchar // for example country
address_value varchar // for example US
(you probably also want to put a unique key on (userId,adress_type))
So habe ich es gemacht und wie ich es in den meisten Fällen gesehen habe.
Ein anderer Weg wäre:
Table users
===========
userName varchar primary
Table adressdata
==========
userName varchar references users.userName
adress_type varchar // for example country
address_value varchar // for example US
(you probably also want to put a unique key on (userName,adress_type))
Hier speichern wir den vollständigen Benutzernamen auch in der Adressdata-Tabelle.
Für mich hat dies folgende Vorteile:
Sie können den Benutzernamen sofort aus der Tabelle auswählen, ohne ihn einer anderen Tabelle hinzufügen zu müssen. In diesem Beispiel ist dies aus Sicht der Anwendung wahrscheinlich nicht so relevant, aber es ist nur ein Beispiel.
Es ist möglicherweise einfacher, die Datenbank in einer Master-Master-Replikationsumgebung zu skalieren, da keine Konflikte mit der automatischen Inkrementierung vorliegen.
Aber auch die Nachteile:
- Der Platzbedarf für den Index und die Daten (aber relevanter wird wahrscheinlich der Index sein) für das Feld in der zweiten Tabelle ist höher.
- Eine Änderung des Benutzernamens müsste an alle Tabellen weitergegeben werden. Dies ist ressourcenintensiver als nur das Ändern in einer Tabelle und das Beibehalten der IDs.
Meiner Meinung nach ist es viel einfacher, mit Textfeldern zu arbeiten und keine Inkrement-IDs zu verwenden, und die Kompromisse sind minimal und in den meisten Anwendungen nicht relevant.
Natürlich werden einige Objekte aufgrund ihrer Art mit einer inkrementierenden Nummer identifiziert (z. B. sollten Forenbeiträge eine inkrementierende ID erhalten, da es wahrscheinlich kein anderes eindeutiges Feld wie den Titel oder so gibt).
Bevor ich jedoch anfange, meine Datenbanklayouts ganz anders zu gestalten, möchte ich wissen, ob es Dinge gibt, an die ich nicht gedacht habe.
Gibt es Best Practices?
Gibt es Vor- / Nachteile, an die ich nicht gedacht habe und deren Auswirkungen zu einem späteren Zeitpunkt auftreten können?
Wie gestalten Sie persönlich Datenbanken zu den oben genannten Punkten und warum?