PDA

View Full Version : [basi di Dati] dubbi sulla teoria


TorpedoBlu
09-03-2005, 20:04
ciao ragazzi sto studiando basi di dati e mi porgo alcuni dubbi.
Nelle tabelle bisogna segnare la chiave primaria per far si che attraverso di essa ogni riga sia una e unica (la matricola, il seriale, l'id e via dicendo)
ma non capisco l'uso della chiave esterna, nel senso che quando faccio un join se questa è segnalata o meno cosa cambia?

Alien
09-03-2005, 22:24
"Una chiave esterna e' un'insieme di attributi di un'entita' che identifica univocamente un'istanza di un'altra entita'. "
(la prima definizione che ho trovato)

La sua importanza non è tanto nell'esecuzione delle selezioni ma negli inserimenti e nelle cancellazioni

guldo76
10-03-2005, 00:11
In altre parole è abbastanza inutile per fare un join in una query.
Però è essenziale per l'integrità referenziale (quando devi creare/modificare/eliminare dati rispettandola).

TorpedoBlu
10-03-2005, 09:55
si ma la mia domanda è: se non ci fossero quelle 2 chiavi esterne dichiarate, cosa cambierebbe? (ma durante la dichiarazione devo esplicitare a quale chiave di altra tabella si riferisce la chiave esterna che sto dichiarando?)


Fatemi capire se sto modificando una riga di una tabella dove c'è una chiave esterna lui non mi fa modificare la chiave? in che modo?

TorpedoBlu
10-03-2005, 10:06
mhmm ok forse ho capito..

altra cosa: devo fare una base di dati che gestisca i giocatori di calcio per il fantacalcio; ognuno ha una rosa di 25giocatori e deve schierare una formazione settimanale di 11+3.
la formazione secondo voi la implemento come una vista o metto un campo alla tabella rosa che dice :titolare|panchinaro|riserva e la modifico settimana per settimana?

recoil
10-03-2005, 17:00
Originariamente inviato da TorpedoBlu
altra cosa: devo fare una base di dati che gestisca i giocatori di calcio per il fantacalcio; ognuno ha una rosa di 25giocatori e deve schierare una formazione settimanale di 11+3.


guarda che in 11+3 gioca solo la Juventus. devi fare un controllo sul nome della squadra :asd:

la formazione secondo voi la implemento come una vista o metto un campo alla tabella rosa che dice :titolare|panchinaro|riserva e la modifico settimana per settimana?

puoi anche creare una tabella formazione nella quale hai una chiave esterna che riguarda la squadra e 11+3 chiavi esterne che fanno riferimento ai giocatori.
se ci aggiungi pure un campo con il numero di giornata puoi anche tenere traccia di tutte le formazioni che hanno giocato durante il campionato

cmq tutto dipende da cosa ti chiede il progetto

Alien
10-03-2005, 17:35
Originariamente inviato da recoil
puoi anche creare una tabella formazione nella quale hai una chiave esterna che riguarda la squadra e 11+3 chiavi esterne che fanno riferimento ai giocatori.
se ci aggiungi pure un campo con il numero di giornata puoi anche tenere traccia di tutte le formazioni che hanno giocato durante il campionato


Allora io direi di fare
1 tabella giocatori con i campi IDGiocatore (chiave primaria) - IDSquadra (chiave esterna) - NomeCognomeGiocatore
1 tabella squadre con i campi IDSquadra (chiave primaria) - DescrizioneSquadra
1 tabella Ruolo con i campi IDRuolo (chiave primaria) - Descrizione (contenente i valori Titolare/panchina/ecc)
1 tabella Giornate con i campi IDGiornata - IDSquadra (chiave esterna) - IDGiocatore (chiave esterna) - IDRuolo (chiave esterna) - Descrizione Giornata

A questo punto le prime 3 tabelle le popoli una volta sola all'inizio del campionato mentre la tabella principale è la "Giornate"
Qui verranno memorizzate praticamente le formazioni di ogni giornata.
Il vantaggio che si ha è che un giocatore può cambiar squadra senza problemi: nella tabella giocatori cambierà il valore della squadra
ma nello storico (Giornate) verrà riportato correttamente la squadra di appartenenza.
Per ottener la formazione attuale di una squadra sarà quindi sufficiente una vista con la join tra la tabella giocatori e squadre
e così via

Scoperchiatore
11-03-2005, 11:26
Originariamente inviato da recoil
guarda che in 11+3 gioca solo la Juventus. devi fare un controllo sul nome della squadra :asd:


Hai ragione, ma credo che +3 stia per le sostituzioni.
Quindi, torpedo, ricordati di fare una tabella "Juve" in cui i giocatori sono 14+3 :asd:

Scoperchiatore
11-03-2005, 11:40
un esempio di uso delle chiavi esterne può essere questo.

Ho un database di libri. Ogni tanto i libri, ovviamente, non vengono restituiti, quindi devo cancellarli.

Immagina uno schema ER abbastanza complesso e normalizzato, ovvero in cui un libro abbia una struttura di questo tipo:

Tabella Libro

id_libro
id_Titolo
id_Autore
id_Editore
Id_Codici
...
...


dove id_libro è la chiave primaria del libro, e id_Titolo, id_Autore sono chiavi esterne.
id_Titolo si riferisce alla tabella Titolo, ma nella tabella Titolo, in cui questo id si andrà a cercare, non c'è solo il titolo, ma magari il sottotitolo, la data di creazione del titolo, un campo in cui si dice se questo titolo deriva da un congresso scientifico, un campo in cui si dice la lingua del titolo, etc.. etc etc.

Tabella Titolo
id_Titolo
Titolo
Sottotitolo
Anno di creazione
Congresso
Lingua
...
..
..

Ora il problema che ti si pone è questo: nella libreria possiamo perdere un libro, o venderlo, o non ci viene restituito. Cosa faccio quando devo eliminare un libro?

Beh, elimino la riga relativa nella tabella Libro

E poi? mi fermo qui?
No, devo eliminare anche la riga con id_Titolo corrispondente nella tabella Titolo. Ma come faccio a raggiungere questa riga se non avevo una chiave esterna nella tabella libro che referenziava una riga della tabella titolo?

Senza le chiavi esterne questa operazione non sarebbe possibile ;)

Ti faccio notare che non è così "banale" decidere che politica adottare. Un autore, per esempio, non lo eliminerei, può aver fatto anche altri libri. Idem per l'editore. etc.. etc... Mentre la riga titolo va sicuramente elminata, dato che se elimini il libro non ha più senso avere una riga con il titolo di un libro inesistente :D

TorpedoBlu
11-03-2005, 19:47
Originariamente inviato da Alien
Allora io direi di fare
1 tabella giocatori con i campi IDGiocatore (chiave primaria) - IDSquadra (chiave esterna) - NomeCognomeGiocatore
1 tabella squadre con i campi IDSquadra (chiave primaria) - DescrizioneSquadra
1 tabella Ruolo con i campi IDRuolo (chiave primaria) - Descrizione (contenente i valori Titolare/panchina/ecc)
1 tabella Giornate con i campi IDGiornata - IDSquadra (chiave esterna) - IDGiocatore (chiave esterna) - IDRuolo (chiave esterna) - Descrizione Giornata

A questo punto le prime 3 tabelle le popoli una volta sola all'inizio del campionato mentre la tabella principale è la "Giornate"
Qui verranno memorizzate praticamente le formazioni di ogni giornata.
Il vantaggio che si ha è che un giocatore può cambiar squadra senza problemi: nella tabella giocatori cambierà il valore della squadra
ma nello storico (Giornate) verrà riportato correttamente la squadra di appartenenza.
Per ottener la formazione attuale di una squadra sarà quindi sufficiente una vista con la join tra la tabella giocatori e squadre
e così via
grazie mille, per quanto riguarda gli id non mi piaciono molto, pensavo di usare il cognome tanto nelle specifiche di questo progetto ho che non possono esserci 2 giocatori con lo stesso cognome, non ci sono 2 squadre di fantacalcio con lo stesso nome e + squadre possono possedere lo stesso giocatore.

pensavo di fare
Giocatori(nome (PK)quotazione)
Utenti (nomeutente(PK), password, nomesquadra(FK), fantamigliardi)
Squadra(nomesquadra(PK), utente(FK), rosa(FK))
Rose (nomesquadra(FK), nomegiocatore(FK))(PK)
Ruoli (ruolo(PK), descrizione)
Giornate (IDGiornata(PK), nome_giocatore(FK), ruolo (FK), voto)

mi manca la classifica, ma fino ad ora come idee come vanno?

TorpedoBlu
12-03-2005, 09:36
se qualcuno mi consiglia un soft per disegnare diagrammi ER possi disegnare qualcosa e postarlo

Alien
12-03-2005, 09:39
Originariamente inviato da TorpedoBlu
se qualcuno mi consiglia un soft per disegnare diagrammi ER possi disegnare qualcosa e postarlo

già con Access, se non ricordo male, puoi disegnarti diagrammi ER.
Oppure Visio, Sql server, Erwin.
Purtroppo non conosco prodotti free, facendolo per lavoro posso sempre aver a disposizione strumenti che si pagano

TorpedoBlu
12-03-2005, 14:00
vorrei implementare il tutto con Postgres, ma è la prima volta, sto leggendo un tutorial, ho installato Apache e postgres e Php su linux.
Appena faccio in diagramma lo posto.

TorpedoBlu
14-03-2005, 23:49
ho fatto una bozza di schema, è un pochetto incasinato, ma forse qualcuno può darmi un consiglio

Alien
15-03-2005, 09:18
Originariamente inviato da TorpedoBlu
ho fatto una bozza di schema, è un pochetto incasinato, ma forse qualcuno può darmi un consiglio

Tu posta.
Quando trovo 5 minuti liberi gli posso dar un'occhiata

TorpedoBlu
15-03-2005, 15:04
http://torpedoblu.altervista.org/schema.jpg

Scoperchiatore
16-03-2005, 19:49
gli id VANNO OBBLIGATORIAMENTE usati, almeno nei progetti grandi ;)

I casi di omonimia vanno SEMPRE presi in considerazione, i casi di ampliamento della base di dati, etc etc etc, non vanno mai tralasciati ;)

Scoperchiatore
16-03-2005, 19:50
Originariamente inviato da TorpedoBlu
http://torpedoblu.altervista.org/schema.jpg

Come se legge? :D
E' UML modificato sull'ER? :D

Edit: ok, capito che FK sta per foreign key.

A me non piace perchè mancano gli id.
Inoltre non si capiscono le cardinalità. Bianco è 1, Nero è molti, mi sembra di capire, ma come vengono piazzate sembra più da UML che ER :what:
la tabella privilegio non so a cosa serva, che privilegi sono?
Giornata , Schieramento e Modulo mi sembrano inutili. Sono dei valori normalissimi, anche se li ripeti non succede nulla.
A che serve il privilegio nella rosa?
Dalla rosa toglierei anche l'allenatore per una questione di normalizzazione, ma magari per efficienza ci può stare.