Ich bin sehr neu im Thema Datenbanken, daher klingt dies vielleicht unwissend, aber ich bin neugierig, warum ein Schlüssel in einer Tabelle explizit angegeben werden sollte. Soll dies in erster Linie dem Benutzer mitteilen, dass der angegebene Spaltenwert (hoffentlich) in jeder Zeile eindeutig ist? Die Einzigartigkeit sollte auch dann noch vorhanden sein, wenn sie nicht erwähnt wird.
primary-key
unique-constraint
dsaxton
quelle
quelle
Antworten:
Sie schlagen offensichtlich vor, dass
CONSTRAINT
s in einer Datenbank von der / den Anwendung (en) erzwungen werden sollen, die / die auf diese Datenbank zugreifen?Es gibt viele Gründe, warum dies eine schlechte Idee ist.
1) Wenn Sie eine "Roll-Your-Own" -Einschränkungs-Engine (dh innerhalb Ihres Anwendungscodes) erstellen, emulieren Sie lediglich das, was Oracle / SQL Server / MySQL / PostgreSQL / <. Whoever ...> ausgegeben hat Jahre schreiben. Ihr CONSTRAINT-Code wurde in diesen Jahren von buchstäblich Millionen von Endbenutzern getestet .
2) Bei allem Respekt vor Ihnen und Ihrem Team werden Sie es auch in wenigen Jahren nicht richtig machen - von hier aus hat MySQL-Code allein 40 Millionen Dollar gekostet. Und MySQL ist der billigste der drei oben genannten Server und implementiert nicht einmal CHECK CONSTRAINTs. Offensichtlich ist es schwierig, RI (Referential Integrity) vollständig richtig zu machen.
Ich war oft in den Oracle-Foren und kann Ihnen nicht sagen, wie oft ein armer Manager / Programmierer ein Projekt angestoßen hat, bei dem das Genie, das zuvor seinen Job hatte, die "gute" Idee hatte, das zu tun, was Sie vorschlagen .
Jonathan Lewis (er schrieb ein 550-seitiges Buch über die Grundlagen des Oracle-Optimierers ) gibt als Nr. 2 seiner Design Disasters finden sich in einem anderen Buch (" Tales of the Oak Table " - der Oak Table ist eine Gruppe von Oracle-Experten)
3) Auch wenn Sie RI wie durch ein Wunder richtig implementieren können, müssen Sie es für jede Anwendung, die diese Datenbank berührt, immer wieder vollständig neu implementieren - und wenn Ihre Daten wichtig sind, werden es neue Anwendungen sein. Wenn Sie dies als Paradigma wählen, werden Sie und Ihre Programmierkollegen (ganz zu schweigen von Support-Mitarbeitern und Verkäufen) ein Leben in ständiger Brandbekämpfung und Elend erleben.
Lesen Sie hier , hier und hier, warum die Implementierung von data CONSTRAINTs auf Anwendungsebene geradezu Wahnsinn ist .
Um Ihre Frage konkret zu beantworten:
Der Grund , dass
KEY
s (entwederPRIMARY
,FOREIGN
,UNIQUE
oder nur gewöhnlichINDEX
n) deklariert sind , ist , dass, während es nicht unbedingt notwendig für eine Datenbank , sie zu haben für sie funktionieren, ist es unbedingt erforderlich , dass sie dafür Funktion deklariert werden , gut .quelle
Wenn Sie einen Schlüssel in einer Datenbank erstellen, erzwingt die DBMS-Engine eine Eindeutigkeitsbeschränkung für die Schlüsselattribute. Dies dient mindestens drei verwandten Zwecken:
quelle
Ich werde einen Aspekt zu den vorhandenen hervorragenden Antworten hinzufügen: Dokumentation. Oft ist es wichtig zu sehen, welche Arten von Schlüsseln Sie zum Identifizieren einer Entität verwenden können. Jede Kombination eindeutiger Spalten ist ein Kandidatenschlüssel.
Der Primärschlüssel ist in der Praxis in der Regel ein besonders nützliches Konzept.
Unabhängig davon, ob Sie einen Schlüssel erzwingen oder nicht (Sie sollten dies wahrscheinlich tun), ist die Dokumentation für sich allein von Nutzen.
quelle
FOREIGN KEY
Definitionen a zu erhalten für das System fühlen ". Meine Anfrage ergab zip !!! Sicher, dass mein SQL falsch gewesen sein muss, erwähnte ich dies einem der leitenden Programmierer. Mit Stolz (nicht weniger) kündigte er an (als würde er einen neugeborenen Sohn präsentieren), dass das System keine FKs habe, weil "alle Suchen aufPRIMARY KEY
s" seien - (irrelevant). <Doh ...> a la Homer Simpson!Ein weiterer Grund, warum Sie CONSTRAINTs anstelle von Inside-Application-Code verwenden sollten:
Was passiert, wenn ein Entwickler / DBA eine Anweisung zum Einfügen / Aktualisieren / Löschen verwendet, um die Daten direkt in der Datenbank zu ändern? In diesem Fall ist Ihre gesamte anwendungsbasierte referenzielle Integrität unbrauchbar. Ich weiß, manche Entwickler mögen die Möglichkeit, Daten direkt zu ändern, ohne sich um RI kümmern zu müssen, weil sie wissen, was sie tun - zumindest die meiste Zeit (aber nicht immer)
PS: Natürlich können Sie Trigger erstellen, aber diese sind normalerweise sehr langsam (im Vergleich zu CONSTRAINTS).
quelle