Relazioni fra tabelle

martedì 18 dicembre 2007 - 08.07

denis.basei Profilo | Senior Member

In un database SQL server 2005 express devo creare una relazione del tipo "padre-figli" fra due tabelle, di nome rispettivamente ParLav e ParLavDett. I campi chiave di ParLav sono:
IDMacchina tinyint
IDArticolo nvarchar(20)
IDLAvorazione nvarchar(20)

Non ho ancora strutturato la tabella ParLavDett perchè non so se mi conviene la soluzione 1 oppure 2.

SOLUZIONE 1:
Ripeto i campi chiave del padre ed aggiungo un progressivo sempre in chiave: IDMacchina, IDArticolo, IDLavorazione, IDPrg

SOLUZIONE 2:
Creo in ParLav un campo autoincrementanto che chiamo IDPrg così da non riscrivere in ParLavDett i campi IDMacchina, IDArticolo e IDLavorazione. Scrivo solo IDPrg.


Quale delle due soluzioni è la migliore? Oppure avete qualche soluzione migliore di entrambe?


Grazie

Denis

lbenaglia Profilo | Guru

>Quale delle due soluzioni è la migliore? Oppure avete qualche
>soluzione migliore di entrambe?

Ciao Denis,

Io opterei per la seconda soluzione, dato che in questo caso non vedrei l'utilità di definire una chiave surrogata.
Sulla tabella dalla parte molti della relazione definisci un constraint di Foreign Key sulle tre colonne IDMacchina, IDArticolo e IDLavorazione.

>Grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

denis.basei Profilo | Senior Member

Ciao, forse ho capito male ma se mi suggerisci di definire un constraint di Foreign Key su ParLavDett la soluzione è la 1, non la 2...

lbenaglia Profilo | Guru

>Ciao, forse ho capito male ma se mi suggerisci di definire un
>constraint di Foreign Key su ParLavDett la soluzione è la 1,
>non la 2...
Forse non ho capito la domanda
Posta i comandi DDL delle due tabelle ed illustra sempre via codice cosa vorresti fare.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

denis.basei Profilo | Senior Member

Allego le query di creazione delle due tabelle, come da ipotesi n.1: ad ogni record padre di ParLav esistono n records figli in ParLavDett. Il mio dubbio è se conviene, in alternativa a quanto ho fatto, creare un campo IDDett in ParLav e fare la relazione con ParLavDett solo con IDDett:
ParLav avrebbe come campi chiave IDMacchina, IDArticolo, IDLAvorazione, IDDett
ParLavDett avrebbe come campi chiave IDDett, IDPgr


Denis

lbenaglia Profilo | Guru

>Il mio dubbio è se conviene, in alternativa a
>quanto ho fatto, creare un campo IDDett in ParLav e fare la relazione
>con ParLavDett solo con IDDett:
Eventualmente dovresti fare esattamente il contrario, ovvero definire una nuova colonna nella tabella ParLav, renderla PK, inserirla in ParLavDett e definire su di essa un constraint di FK.
Il constraint FK si definisce SEMPRE dalla parte molti della relazione.

Io comunque lascerei le cose come sono.... a parte un piccolo dubbio: per quale motivo utilizzi un data type UNICODE per le stringhe? C'è un vero motivo oppure si tratta di una svista?

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

denis.basei Profilo | Senior Member

Grazie, in merito all'unicode ti dirò che in effetti, documentandomi un attimo, non conviene per le stringhe che devo memorizzare. Occupo più spazio per nulla.
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5