Während einer der letzten Lektionen an der Universität (ich bin Student) bat uns der Dozent, eine Datenbank (MySQL Server, wenn es darauf ankommt) und eine winzige Client-App zu entwickeln, die die Datenbank als Datenquelle verwendet.
Eine der Anforderungen war, dass die Identitätsspalte (die die PK in jeder Tabelle ist) sequentiell sein muss, da dies eine gute Praxis ist (gemäß den Worten des Dozenten). Das heißt, wenn die Tabellenzeile gelöscht wird, muss die PK in nachfolgenden Einfügungen wiederverwendet werden. Ich habe durchschnittliche Kenntnisse in RDBMS, PKs und Identitätsspalten. Soweit ich weiß, ist diese Identitätsspalte nur eine Möglichkeit, die DB beim Einfügen von Zeilen automatisch PKs generieren zu lassen, und nicht mehr. Der Wert der Identitätsspalte darf in keiner Weise mit Zeilenattributen in Beziehung stehen (solange es sich nicht um einen natürlichen Schlüssel handelt).
Diese Anforderung (streng sequentielle Identitätsspalte) war mir verdächtig. Ich habe versucht, den Dozenten zu fragen, was falsch ist, wenn die Identität nicht sequentiell ist (mit Lücken, die durch Löschungen verursacht werden), erhielt jedoch eine sehr abstrakte Antwort wie "Es ist praktisch für Benutzer und nützlich für DB-Administratoren, die die Datenbank verwalten". Keine konkreten Beispiele. Das Argument "praktisch für Benutzer" klingt albern, weil es im Geschäftsbereich keine Bedeutung hat.
Deshalb bin ich neugierig, ob diese Gründe real sind? Ich kann mir nur einen Fall vorstellen, in dem eine erneute Eingabe der Identitätsspalte erforderlich ist - wenn der Identitätsraum erschöpft ist. Dies ist jedoch ein größeres Designproblem, wenn der Identitätsspaltentyp falsch ausgewählt wurde, z. B. einfach int
anstelle von bigint
oder uniqueidentifier
wenn die Tabelle Milliarden Zeilen enthält. Angenommen, eine Identitätsspalte ist ein Clustered-Index: Können Lücken in der Identitätsspalte die Indexleistung beeinflussen? Vielleicht gibt es andere reale Gründe für das automatische erneute Setzen von Identitätsspalten nach jedem Löschen, das mir nicht bekannt ist?
Danke im Voraus!