Aus mathematischer Sicht scheint es eine kurzsichtige Entwurfsentscheidung zu sein, Primärschlüssel durch einen beliebigen Namen anstelle einer einfachen Tabelleneigenschaft zu referenzieren, vorausgesetzt, dass eine Tabelle höchstens einen Primärschlüssel hat.
Um einen Primärschlüssel von "nicht gruppiert" in "gruppiert" oder umgekehrt zu ändern, müssen Sie zuerst nach seinem Namen suchen, ihn dann löschen und schließlich erneut lesen.
Gibt es einen Vorteil bei der Verwendung von willkürlichen Namen, die ich nicht sehe, oder gibt es ein DBMS, das keine willkürlichen Namen für Primärschlüssel verwendet?
Edit 2011-02-22 (02/22/2011 für diejenigen, die das Datum nicht sortieren möchten):
Lassen Sie mich die Funktion zeigen, mit der Sie die Namen eines Primärschlüssels aus seinem Tabellennamen ableiten können (unter Verwendung früherer SQL-Server- oder Sybase-Systemtabellen):
create function dbo.get_pk (@tablename sysname)
returns sysname
as
begin
return (select k.name
from sysobjects o
join sysobjects k on k.parent_obj = o.id
where o.name = @tablename
and o.type = 'U'
and k.type = 'k')
end
go
Wie gbn sagt, mögen keine Leute den generierten Namen wirklich, wenn Sie keinen expliziten Namen angeben:
create table example_table (
id int primary key
)
select dbo.get_pk('example_table')
Ich habe gerade bekommen
PK__example___3213E83F527E2E1D
Aber warum müssen Namen in sysobjects eindeutig sein? Es wäre vollkommen in Ordnung, für die Tabelle und ihren Primärschlüssel genau denselben Namen zu verwenden.
Auf diese Weise mussten wir keine Namenskonventionen einrichten, die versehentlich verletzt werden könnten.
Nun Antworten zu Marian:
- Ich habe nur die Aufgabe verwendet, einen gruppierten in einen nicht gruppierten Primärschlüssel zu ändern, als Beispiel, bei dem ich den tatsächlichen Namen des Pakets kennen muss, um ihn löschen zu können.
- Dinge müssen keine Eigennamen haben, es reicht aus, wenn sie leicht eindeutig bezeichnet werden können. Das ist die Basis der Abstraktion. Objektorientierte Programmierung geht so. Sie müssen keine unterschiedlichen Namen für ähnliche Eigenschaften verschiedener Klassen verwenden.
- Es ist willkürlich, weil es eine Eigenschaft einer Tabelle ist. Der Name der Tabelle ist alles, was Sie wissen müssen, wenn Sie es verwenden möchten.