Relazioni chiavi - problema di ripetizione percorsi a cascata

venerdì 23 marzo 2012 - 12.12
Tag Elenco Tags  Windows Server 2008 R2  |  SQL Server 2008 R2  |  SQL Server 2008  |  SQL Server Express

andrestu Profilo | Expert

allego un immagine con il diagramma della struttura tabellare sintetizzato al massimo per farvi capire meglio il 'problema'.


1173x751 31Kb


Spiegazione:
- tutti i record cantieri devono avere associato un utente
- tutti i record immobili devono avere associato un utente
- i record immobili possono avere associato un cantiere (ma anche no)

Azione:
- se elimino un record cantiere devo eliminare anche tutti i record immobili ad esso associati
Risoluzione:
- imposto sulla relazione tra cantieri e immobili "delete rule: cascade"

Azione:
- se elimino un record utente devo eliminare tutti i record cantieri e immobili ad esso associati
Risoluzione parziale (rimarrebbero orfani tutti gli immobili a cui non è associato nesun cantiere):
- imposto sulla relazione tra utenti e cantieri "delete rule: cascade"

a questo punto per fare in modo che anche gli immobili a cui non è associato nessun cantiere vengano eliminati dovrei impostare la stessa regola (delete rule: cascade) anche nella relazione tra utenti e immobili ma non posso perchè mi viene restituito il messaggio:
... may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION ...

Come risolvere il problema?
L'unica cosa che mi è venuta in mente è modificare la struttura eliminando la relazione tra utenti e immobili e facendo in modo che ad ogni immobile corrisponda sempre un cantiere, in questo modo eliminando un utente elimino anche tutti i cantieri ad esso associati eliminando anche gli immobili.
Non mi piace molto come soluzione perchè così dovrei obbligatoriamente associare ogni immobile ad un cantiere, cosa che per alcuni record sarebbe inutile...

Grazie in anticipo per possibili soluzioni o idee alternative...








Andrea Restucci - Web Developer

alx_81 Profilo | Guru

>allego un immagine con il diagramma della struttura tabellare
>sintetizzato al massimo per farvi capire meglio il 'problema'.
>
>
>
>Spiegazione:
>- tutti i record cantieri devono avere associato un utente
>- tutti i record immobili devono avere associato un utente
>- i record immobili possono avere associato un cantiere (ma anche no)
sinceramente non metterei proprio l'idutente nella immobili.
Ma per affermare questo, è necessario che l'idutente del cantiere sia lo stesso degli immobili.
In questo modo l'idutente è relazionato SOLO coi cantieri e un cantiere detiene la relazione coi suoi immobili.
Mi sembra un modello più normale a prima vista.. che dici?
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

andrestu Profilo | Expert

ciao Alex,
nel frattempo ho modificato la struttura in questo modo:


836x486 14Kb


ogni immobile e cantiere sono legati alla tabella ImmobileCantiereMaster,
per n.1 immobile avrò un record nella tabella ImmobileCantiereMaster e uno nella tabella Immobile
per n.1 cantiere avrò un record nella tabella ImmobileCantiereMaster e uno nella tabella cantiere
se al cantiere voglio collegare nX immobili basta che i recordi della tabella immobili fanno riferimento allo stesso record della tabella ImmobileCantiereMaster a cui fa riferimento il cantiere in questione
cancellando un cantiere eliminando il relativo record nella tabella ImmobileCantiereMaster verrà eliminato sia il cantiere che tutti gli immobili ad esso associtai

cosa ne pensi?

Andrea Restucci - Web Developer

alx_81 Profilo | Guru

>cosa ne pensi?
se per la tua situazione reale è ok, credo che vada bene. Non posso dirti altro considerato il fatto che siamo partiti da una situazione un po' diversa e hai comunque adattato lo schema ad una tua soluzione
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5