DELETE bei Viele: 1 Relation

DELETE bei Viele: 1 Relation

am 18.12.2005 18:03:28 von Peter Sommerfeld

Hi,

ein Newbie-Verständnisproblem ...

Nehmen wir an ich habe 2 Tabellen,

Tabelle user
-------------
id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY
....
obj_id SMALLINT UNSIGNED
ENGINE InnoDB
-------------

Tabelle objects
---------------
id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY
.....
ENGINE InnoDB
---------------

Jetzt können mehrere User eines der Objekte
referenzieren (feld obj_id), also eine
Viele:1 Relation wenn ich das richtig verstehe.

Das jeweilige Objekt soll nun gelöscht werden
wenn *alle* Referencen auf das Object gelöscht
sind, sei es durch UPDATE oder durch löschen
des Users. Das könnte man jetzt über einen
Referenzcount machen aber ich hoffe doch dass
das einfacher geht: Vielleicht über FOREIGN KEY
und/oder REFERENCES(object) ???

Wie mach Ich's ?

Peter

Re: DELETE bei Viele: 1 Relation

am 18.12.2005 20:33:14 von stefan hoffmann

tach Peter,

Peter Sommerfeld schrieb:
> Das jeweilige Objekt soll nun gelöscht werden
> wenn *alle* Referencen auf das Object gelöscht
> sind, sei es durch UPDATE oder durch löschen
> des Users.
Wie willst du zwischen diesem Objekt und einem neuen Objekt ohne
Referenzen unterscheiden?


mfG
--> stefan <--

Re: DELETE bei Viele: 1 Relation

am 18.12.2005 20:55:37 von Peter Sommerfeld

Grüß di Stefan !

stefan hoffmann schrieb:
> Peter Sommerfeld schrieb:
>> Das jeweilige Objekt soll nun gelöscht werden
>> wenn *alle* Referencen auf das Object gelöscht
>> sind, sei es durch UPDATE oder durch löschen
>> des Users.
>
> Wie willst du zwischen diesem Objekt und einem
> neuen Objekt ohne Referenzen unterscheiden?

Es werden keine Objekte ohne Referencen angelegt.
Ein User erstellt es und bekommt eine Referenz.
Weitere Referencen entstehen dadurch das andere
User oder auch anderen Tabellen das Objekt
referenzieren. Wenn keine Referenzen mehr
vorhanden sind wird es gelöscht. Also so etwas
wie Garbage Collection auf Tabellen.

Peter

Re: DELETE bei Viele: 1 Relation

am 18.12.2005 22:08:23 von stefan hoffmann

tach Peter,

Peter Sommerfeld schrieb:
>>> Das jeweilige Objekt soll nun gelöscht werden
>>> wenn *alle* Referencen auf das Object gelöscht
>>> sind, sei es durch UPDATE oder durch löschen
>>> des Users.
>> Wie willst du zwischen diesem Objekt und einem
>> neuen Objekt ohne Referenzen unterscheiden?
> Es werden keine Objekte ohne Referencen angelegt.
> Ein User erstellt es und bekommt eine Referenz.
> Weitere Referencen entstehen dadurch das andere
> User oder auch anderen Tabellen das Objekt
> referenzieren. Wenn keine Referenzen mehr
> vorhanden sind wird es gelöscht. Also so etwas
> wie Garbage Collection auf Tabellen.
Ah, ok.

Du hast keine 1:n Beziehung, sondern eine n:m Beziehung. D.h. eine
Zwischentabelle, in etwa:

Tabelle References
-------------
id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY
.....
obj_id SMALLINT UNSIGNED
usr_id SMALLINT UNSIGNED
ENGINE InnoDB
-------------

obj_id und usr_id sind nicht NULL, sie sind auch Kandidaten für den PK.
Sind sind auch Foreign Keys in die jeweiligen Tabellen mit ON CASCADE
DELETE.

Daneben brauchst du auch noch einen Trigger auf der References-Tabelle,
welcher verweiste Objekte löscht.

Alternativ kannst du die Funktionalität in entsprechende Stored
Procedures auslagern.


mfG
--> stefan <--

Re: DELETE bei Viele: 1 Relation

am 19.12.2005 00:25:09 von Peter Sommerfeld

Hi Stefan

> Du hast keine 1:n Beziehung, sondern eine
> n:m Beziehung. D.h. eine Zwischentabelle,
> in etwa:
>
> Tabelle References
> -------------
> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY
> ....
> obj_id SMALLINT UNSIGNED
> usr_id SMALLINT UNSIGNED
> ENGINE InnoDB
> -------------

Du meinst dafür *braucht* man eine Zwischentabelle ?

> obj_id und usr_id sind nicht NULL,

Klar

> sie sind auch Kandidaten für den PK.

Primary Keys ?

> Sind sind auch Foreign Keys in die jeweiligen
> Tabellen mit ON CASCADE DELETE.

Wie deklariert man so etwas ?

Table references
------------
id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY
usr_id SMALLINT UNSIGNED references user
obj_id SMALLINT UNSIGNED references object
ENGINE InnoDB
-------------

> Daneben brauchst du auch noch einen Trigger auf
> der References-Tabelle, welcher verweiste Objekte
> löscht.
>
> Alternativ kannst du die Funktionalität in
> entsprechende Stored Procedures auslagern.

Mmm, davon hab ich als Anfänger leider noch
keine Ahnung. Ich kann mir zwar unter Stored
Procedures oder Trigger rein programmatisch
was vorstellen, weiss aber noch nicht wie das
gemacht wird.

Ich denke das übersteigt z.Z. noch meinen
SQL-Horizont und ich werde das primitiv
lösen. Ich muss mich da erst einmal einlesen ...

thanks

Peter