Constraint ForenKey | Progettazione di DataBase Relazionali

Topic: Pubblico - Composto da 8 Posts di 2 Utenti.

19 Novembre, 2011 00:02 #1
Hg89
Utente

Hg89
Registrato: Mar, 2011
Posts: 6
Offline

Salve Ragazzi,
avrei un dubbio, qualcuno saprebbe spiegare l'opzione "Constraint" posto prima del ForenKey a cosa servirebbe di preciso? Cioè qual'è il vantaggio di adoperare questa opzione facoltativa (premetto che non sono esperto di mysql).
Spero che qualcuno riesca a darmi delle delucidazioni a riguardo al mio dubbio. Anticipatamente grazie a tutti voi.

Ultima modifica 19 Novembre, 2011 00:04 di Hg89

19 Novembre, 2011 11:59 #2
darasc
Moderatore

darasc
Registrato: Jul, 2010
Posts: 64
Offline

Ciao,

la foreign_key in realtà non è altro che un tipo particolare di constraint mysql. Alcune constraint mysql sono anche, ad esempio, PRIMARY KEY, UNIQUE e NOT NULL.

La parola chiave CONSTRAINT posta prima della foreign key ti permette di assegnare un nome all'indice che rappresenta la foreign key. INNO_DB utilizza questi indici per non effettuare ogni volta lo scan dell'intera tabella e individuare subito la chiave, quindi questi indici devono essere unici all'interno del db.
Se non utilizzo constraint, INNO_DB assegna in automatico una propria chiave che però è poco leggibile. Inoltre assegnando un nome scelto da te potrai facilmente individuare la foreign key nel caso volessi aggiornarla o cancellarla.

Di solito per i nomi da assegnare alle foreign key si utilizza la convenzione fk_nomeTabellaOrigine_nomeTabellaDestinazione.

Spero di essere stato utile. Se servono altri chiarienti fammi sapere. Ciao.

19 Novembre, 2011 13:00 #3
Hg89
Utente

Hg89
Registrato: Mar, 2011
Posts: 6
Offline

Grazie per il chiarimento, mi hai tolto un grosso dubbio. Ti volevo chiedere 3 cose:

1) La ForenKey; Primary Key; Unique e not null sono in sè per sè degli indici?

2) Come potrei facilmente individuare la foreign key nel caso volessi aggiornarla o cancellarla? Potresti farmi qualche esempio in merito alla individuazione dell'indice, alla modifica e cancellazione (Cosi concludo l'argomentazione (ForenKey)?

3) Ho un dubbio sul Tipo di dato in Mysql, mi consigli di aprire un altro Topic o posso inserirlo in questo?

Grazie di nuovo per la tua disponibilità.

Ultima modifica 19 Novembre, 2011 13:09 di Hg89

20 Novembre, 2011 07:36 #4
darasc
Moderatore

darasc
Registrato: Jul, 2010
Posts: 64
Offline

1) Foreign Key e Primary Key vengono utilizzate da Inno_DB per velocizzare le operazioni di ricerca di un record; naturalmente anche la constraint unique è di aiuto perchè se effettuo una query indicando il valore del campo unique Inno_DB sa che quel campo è come una primary key in quanto è unico nella tabella. Quindi si possono considerare indici. Not null è una semplice constraint che ti garantisce che quel campo non sia mai nullo.

2) Puoi fare così per aggiungere:

1ALTER TABLE tbl_name
2    ADD [CONSTRAINT [symbol]] FOREIGN KEY
3    [index_name] (index_col_name, ...)
4    REFERENCES tbl_name (index_col_name,...)
5    [ON DELETE reference_option]
6    [ON UPDATE reference_option]

E così per cancellare:

1ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol;

Per modificarla penso che l'unica soluzione sia cancellarla e reinserirla.

3)Meglio che apri un nuovo topic con un titolo pertinente, anche per agevolare altri utenti che magari hanno lo stesso problema e cercano un topic specifico

Se vuoi continuare ad approfondire il tema indici e foreign key ti dò un paio di suggerimenti:

1) InnoDB ti permette di far diventare indice qualsiasi campo (a te scoprire come ;)). Analizza le tue query e vedi se spesso fai ricerche utilizzando campi che non sono chiavi e che quindi magari ti converrebbe far diventare indici

2) Studiati la parola chiave EXPLAIN. Ti sarà molto utile per ottimizzare le tue query e la struttura del tuo DB.

Naturalmente per ogni chiarimento non esitare a chiedere. Ciao. ;)

20 Novembre, 2011 12:25 #5
Hg89
Utente

Hg89
Registrato: Mar, 2011
Posts: 6
Offline

Sei un Mito, grazie 1000... per l'aiuto che mi stai dando.

Ho letto il codice che mi hai postato, però non capisco una cosa; aggiungendo un CONSTRAINT sia per una forenkey o una primarykey ecc..., noi cosi facendo aggiungiamo un nome (personale) all'indice che rappresenta la foreign key o altro...Però noto che dopo la forenkey c'è un altro parametro opzionale [index_name] e poi (index_col_name, ...) ma a questo punto se noi abbiamo già dato un nome a cosa serve questo parametro opzionale?

Ipotizzando di dover mettere mani ad una tabella creata ed ampliata da un'altro progettista, qualè il modo per vedere i nomi degli indici utilizzati dallo sviluppatore che ci ha preceduto?

InnoDB ti permette di far diventare indice qualsiasi campo

quindi se noi creiamo una tabella e la inizializziamo come "ENGINE= INNODB" automaticamente tutte le colonne create, automaticamente vengono create come indice (ovviamente con un nome dato da MySQL)???

Comunque in merito al comando EXPLAIN, ho cercato qualcosa su internet e anche su questo portale ma le guide non sono molto esaurienti, però voglio capirlo meglio perchè a quando pare e l'unico comando adatto per il test delle query.

Ti continuo a ringraziare per i continui aiuti e suggerimenti.

Ultima modifica 20 Novembre, 2011 12:52 di Hg89

21 Novembre, 2011 12:06 #6
darasc
Moderatore

darasc
Registrato: Jul, 2010
Posts: 64
Offline

Ciao,

mi rendo conto che non sono stato abbastanza esauriente per quanto riguarda la spiegazione sulla creazione di una constraint. Rimedio subito ;)

1ALTER TABLE tbl_name
2    ADD [CONSTRAINT [symbol]] FOREIGN KEY
3     [index_name] (index_col_name, ...)
4     REFERENCES tbl_name (index_col_name,...)
5     [ON DELETE reference_option]
6     [ON UPDATE reference_option]

Quando si crea una constraint (foreign key, primary key, unique...) InnoDb oltre a creare una "costrizione" che regola le modifiche a quel determinato campo (nel caso di foreign key il campo deve esistere sulla tabella di riferimento, nel caso di unique ogni valore deve essere unico ecc...), crea anche un indice su quel campo.
Nella query precedente symbol non è altro che il nome che diamo alla constraint, mentre index_name è il nome da dare all'indice che verrà creato sul campo.
InnoDb segue le seguenti regole:
- Se entrambi i valori non vengono dichiarati InnoDb crea dei codici univoci per entrmbi i nomi.
- Se viene valorizzato solo il nome della costraint, all'indice verrà settato lo stesso nome della constraint
- Se si setta solo il nome dell'indice, il nome della foreign key sarà deciso da InnoDb.

Spero sia più chiaro così :)
Comunque sia costraint e indici possono essere strettamente legati dal punto di visto semantico, ma sono due cose distinte.

21 Novembre, 2011 13:12 #7
Hg89
Utente

Hg89
Registrato: Mar, 2011
Posts: 6
Offline

Ottimo, finalmento ho capito come funzionano queste benedette "Constraint". Gentilmente mi potresti chiarire quest'ultimo dubbio?
Sappiamo che la tabella MyISAM a differenza di InnoDB e molto più veloce e sappiamo pure che più indici inseriamo in una tabella più veloci sono le ricerche e meno veloci sono gli inserimenti e aggiornamenti dei records. Però escludendo le colonne dove noi inseriamo le Primary Key, le unique... se creiamo due tabelle identiche ma con una differenza che una e MyISAM e l'altra è InnoDB le colonne che creiamo senza aggiunta delle nostre constraint, le tabelle di MyISAM sono senza indici (a meno che non li inseriamo noi) e quella di InnoDB crea automaticamente un indice per ogni colonna (domanda di riferimento al post tuo N°4)? Grazie ancora per i chiarimenti che mi dai ;).

25 Novembre, 2011 08:37 #8
darasc
Moderatore

darasc
Registrato: Jul, 2010
Posts: 64
Offline
quindi se noi creiamo una tabella e la inizializziamo come "ENGINE= INNODB" automaticamente tutte le colonne create, automaticamente vengono create come indice (ovviamente con un nome dato da MySQL)???

La risposta è no...non crea indici in automatico su ogni campo ma ti permette di crearli.
Per le constraint poi vale tutto ciò che ci siamo detti in precedenza.
Infatti avevo scritto

InnoDB ti permette di far diventare indice qualsiasi campo (a te scoprire come ;)).

Quindi lascio a te il compito di approfondire sull'argomento creazione degli indici ;)

Condividi su:

Loggati o Registrati per replicare