Zu viele Fremdschlüssel

Zu viele Fremdschlüssel

am 08.01.2006 08:15:41 von nikolai.onken

Hallo,

ich benutze DBDesigner um mein Datenbank design zu entwickeln.
Ein modell hat mehrere Verknüpfungen - so z.B. eine Tabelle

CREATE TABLE PST_User (
objectName VARCHAR(50) NOT NULL,
PST_Salutations_objectName VARCHAR(50) NOT NULL,
gf_auth_user_id INT(50) NOT NULL,
PST_Countries_objectName VARCHAR(50) NOT NULL,
PRIMARY KEY(objectName, PST_Salutations_objectName, gf_auth_user_id,
PST_Countries_objectName),
INDEX PST_User_FKIndex1(PST_Salutations_objectName),
INDEX PST_User_FKIndex2(gf_auth_user_id),
INDEX PST_User_FKIndex3(PST_Countries_objectName)
)
TYPE=3DInnoDB;

Jetzt habe ich eine Tabelle PST_Transactions:

CREATE TABLE PST_Transactions (
objectName VARCHAR(50) NOT NULL,
PST_User_gf_auth_user_id INT(50) NOT NULL,
PST_User_PST_Salutations_objectName VARCHAR(50) NOT NULL,
PST_User_objectName VARCHAR(50) NOT NULL,
PST_InvoiceNrs_id INTEGER UNSIGNED NOT NULL,
PST_User_PST_Countries_objectName VARCHAR(50) NOT NULL,
PRIMARY KEY(objectName, PST_User_gf_auth_user_id,
PST_User_PST_Salutations_objectName, PST_User_objectName,
PST_InvoiceNrs_id, PST_User_PST_Countries_objectName),
INDEX PST_Transactions_FKIndex3(PST_User_objectName,
PST_User_PST_Salutations_objectName, PST_User_gf_auth_user_id,
PST_User_PST_Countries_objectName),
INDEX PST_Transactions_FKIndex2(PST_InvoiceNrs_id)
)
TYPE=3DInnoDB;

Der DBDesigner erstellt automatisch Fremdschlüssel für alle Primary
keys aus PST_User. Wenn ich probiere nur einen Fremdschlüssel auf z.B.
PST_User_objectName zu erstellen funktioniert das nicht.
Ich hoffe es ist deutlich was ich meine.
Kann ich das vermeiden oder ist soetwas normal?

Re: Zu viele Fremdschlüssel

am 09.01.2006 10:57:56 von Johannes Vogel

Hi Nikolai

Nikolai Onken wrote:
> Der DBDesigner erstellt automatisch Fremdschlüssel für alle Primary
> keys aus PST_User. Wenn ich probiere nur einen Fremdschlüssel auf z.B.
> PST_User_objectName zu erstellen funktioniert das nicht.
> Ich hoffe es ist deutlich was ich meine.
> Kann ich das vermeiden oder ist soetwas normal?

Das ist natürlich normal. Es ist aber fraglich, ob du tatsächlich solche
umfangreiche Primary Keys tatsächlich halten möchtest. Vielleicht wäre
es doch einfacher, eine auto-increment ID zu verwenden. Das ist aber oft
ideologisch (besser natürliche Keys statt künstliche), aber auch
Performance bedingt (umfangreiche Keys können DB stark beeinträchtigen).

HTH, Johannes

Re: =?iso-8859-1?q?Zu_viele_Fremdschlüssel?

am 09.01.2006 12:09:11 von Axel Schwenke

"Nikolai Onken" wrote:
> Hallo,
>
> ich benutze DBDesigner um mein Datenbank design zu entwickeln.
> Ein modell hat mehrere Verknüpfungen - so z.B. eine Tabelle
>
> CREATE TABLE PST_User (
> objectName VARCHAR(50) NOT NULL,
> PST_Salutations_objectName VARCHAR(50) NOT NULL,
> gf_auth_user_id INT(50) NOT NULL,
> PST_Countries_objectName VARCHAR(50) NOT NULL,
> PRIMARY KEY(objectName, PST_Salutations_objectName, gf_auth_user_id,
> PST_Countries_objectName),
....
> )
> TYPE=InnoDB;

Uhh. Schlecht. Ganz ganz schlecht.

Der primary Key einer InnoDB-Tabelle sollte immer so kurz wie möglich
sein. Sonst wird InnoDB langsam und frißt Speicher ohne Ende. Wenn
deine Spaltenkombination oben UNIQUE sein soll, mach ein extra UNIQUE
constraint auf die Tabelle.

> Der DBDesigner erstellt automatisch Fremdschlüssel für alle Primary
> keys aus PST_User. Wenn ich probiere nur einen Fremdschlüssel auf z.B.
> PST_User_objectName zu erstellen funktioniert das nicht.
> Ich hoffe es ist deutlich was ich meine.

Kein bisschen. Irgendwie verwendest du den Begriff "Fremdschlüssel"
merkwürdig. Ein Fremdschlüssel ist eine Spalte(nkombination) in einer
Tabelle, die eine Spalte(nkombination) einer anderen Tabelle referen-
ziert. D.h. in dieser Tabelle können nur solche Zeilen eingetragen
werden, bei denen die Werte der Spalte(nkombination) bereits in der
referenzierten Tabellen vorhanden sind. Technisch ausgedrückt wird
dieses Constraint auf der referenzierenden Tabelle durch das Syntax-
element FOREIGN KEY ... im CREATE TABLE. MySQL verlangt außerdem, daß
auf der betroffenen Spalte(nkombination) in beiden Tabellen ein Index
liegt - andere RDBMSe erzeugen diese Indizes automatisch, bei MySQL
muß man sie explizit anlegen.

Aus Sicht eines Tools wie DB-Designer entspricht nun jeder Relation
ein solcher Fremdschlüssel. D.h. für jede Relation in deinem Modell
wird DB-Designer entsprechende Indizes und FOREIGN KEY constraints
erzeugen.

Allerdings ist DB-Designer recht alt (AFAIK älter als FOREIGN KEY
Unterstützung in MySQL). Ich kann mir deswegen durchaus vorstellen,
daß DB-Designer merkwürdiges SQL erzeugt. Eventuell willst du ja mal
einen Blick auf den offiziellen Nachfolger MySQL Workbench werfen:

http://ftp.gwdg.de/pub/misc/mysql/Downloads/MySQLDeveloperSu ite/mysql-workbench-noinstall-1.0.1a-alpha-win32.zip


XL

Re: =?iso-8859-1?q?Zu_viele_Fremdschlüssel?

am 10.01.2006 18:58:24 von nikolai.onken

Hallo,

danke für die Antworten! Ich hatte ein Verständnissproblem mit
'Identifying' und 'Non-Identifying' Fremdschlüsseln.
Jetzt ist es mir aber klar!
Viele Grüße,

Nikolai Onken