PDA

View Full Version : [SQL] Relazioni (2,N)


LumberJack
07-12-2012, 10:52
Salve a tutti.
Sto realizzando un db su una ditta di autotrasporti e ho un dubbio su una relazione fra due entita'.
La prima entita' e' LINEA (con codice identificativo id_linea) e la seconda e' FERMATA (con codice identificativo id_fermata). Ora entrambe sono associate ad una relazione COMPOSTA che vede dalla parte di FERMATA una cardinalita' (1,N), mentre dalla parte di LINEA una cardinalita' (2,N). Questo perche' una LINEA dev'essere composta da almeno due fermate (quella d'inizio e quella di arrivo ed eventualmente da delle fermate intermedie).

Ora il mio schema logico e' il seguente:
LINEA(id_linea,...) FERMATA(id_fermata,...) COMPOSTA(linea, fermata, progressivo).
Con vincolo referenziale (fermata->id_fermata) (linea->id_linea)
e fin qui non ci piove.

Il problema e': quando creo fisicamente le tabelle in sql come faccio con un CONSTRAINT a vincolare il fatto che se non esistono almento due tuple di (linea,fermata,progressivo) con la stessa linea allora quella linea non puo' essere usata come dato?

Grazie in aticipo e spero di essere stato chiaro:)

mattxx88
07-12-2012, 10:59
Salve a tutti.
Sto realizzando un db su una ditta di autotrasporti e ho un dubbio su una relazione fra due entita'.
La prima entita' e' LINEA (con codice identificativo id_linea) e la seconda e' FERMATA (con codice identificativo id_fermata). Ora entrambe sono associate ad una relazione COMPOSTA che vede dalla parte di FERMATA una cardinalita' (1,N), mentre dalla parte di LINEA una cardinalita' (2,N). Questo perche' una LINEA dev'essere composta da almeno due fermate (quella d'inizio e quella di arrivo ed eventualmente da delle fermate intermedie).

Ora il mio schema logico e' il seguente:
LINEA(id_linea,...) FERMATA(id_fermata,...) COMPOSTA(linea, fermata, progressivo).
Con vincolo referenziale (fermata->id_fermata) (linea->id_linea)
e fin qui non ci piove.

Il problema e': quando creo fisicamente le tabelle in sql come faccio con un CONSTRAINT a vincolare il fatto che se non esistono almento due tuple di (linea,fermata,progressivo) con la stessa linea allora quella linea non puo' essere usata come dato?

Grazie in aticipo e spero di essere stato chiaro:)
ciao, scusa se disturbo (non me ne intendo di programmazione) mi spiegeresti cos'è un db? (ho una ditta di autotrasporti)

The_ouroboros
07-12-2012, 11:14
Un database che contiene informazioni organizzate in tabelle e lette secondo relazioni stabilite a propri.

Inviato dal mio HUAWEI U8825-1 con Tapatalk 2

LumberJack
07-12-2012, 12:40
Hey mattxx88, non ti preoccupare, siamo qui tutti per imparare e confrontarci, inoltre anch'io sono alle prime armi. Per farti un idea di cosa sia un db ti mando alla risposta di The_ouroboros.
Posso farti un esempio semplice:

Ammettiamo, come dici, di avere una ditta di autotrasporti.
Per esempio dei camion che portano materiale in vari posti e vorresti tenerne traccia. L'idea più banale sarebbe quella di scrivere Camion1 ha fatto queste fermate alle ore in data ecc.... L'idea di una base di dati (data base, db o come vuoi chiamarlo) e' quella, appunto, di realizzare informazioni organizzate.
Quindi potresti modellare l'idea un po' cosi': Una entità CAMION con attributi (Id_camion, Nome, ...) dove ... sono altri campi che vuoi specificare. Questa e' una realizzazione concettuale, quindi ancora tutto su carta, ma sai bene che alla fine avrai una tabella CAMION che avrà come colonne gli attributi e come righe le tuple che vuoi inserire, per esempio (1,Volvo 155,...) e conterra' tutti i tipi di camion che vuoi monitorare (L'id_camion e' la chiave primaria, un indice identificativo che distingue ogni tupla dalle altre, non e' possibile avere ridondanza dei dati, in questo caso e' l'indice 1). Bene ora definiamo l'entita' DESTINAZIONE con attributi (id_destinazione, Indirizzo, ...) e' questa rappresenta la tabella contentente tutte le destinazioni che i miei camion possono percorrere. Ora puoi associare le due entita' attraverso un'associazione; la domanda che devi farti e': Un camion in quante destinazioni può andare? N, e al minimo? Boh, zero o una? Beh diciamo zero se vuoi tenere traccia anche dei camion che stanno fermi a casuccia e uno se invece devono per forza andare da qualche parte. Stessa cosa dalla parte opposta: Data una destinazione, quanti camion possono arrivarci? N, e al minimo? Boh, zero o uno? Se e' zero significa che vuoi mantere anche quelle destinazioni che magari ti sei recato con un camion, ma ora non ci vai piu'. Uno, invece, se necessariamente hai una destinazione comperta da almeno un camion. Ammettiamo sia (1,N) da entrambe le parti, questo significa che avrai un altra tabella PERCORRE con attributi (camion, destinazione,data,ora....) dove camion e destinazione data e ora sono chiavi primarie univoche di questa tabella e camion e destinazione fanno rifermento alle tabelle CAMION e DESTINAZIONE. (tiene traccia degli spostamenti).

Bene dopo tutta questo papiro, molto probabilmente avrai gia' finito di scrivere su carta tutti gli spostamenti senza che ti serva un db, ma viene adesso il bello. Un data base, mette a disposizione una serie di interrogazioni. Vorrei sapere per esempio che spostamenti ha fatto il mio camion. Non entrerò in dettaglio, ti dirò solo che con una manciata di milli secondi il tuo computer potrà darti quella lista senza bisogno che tu debba scrivertela a mano. Un po' come quando vuoi vedere l'elenco degli orari del trano, fa tutto lui con la giusta domanda.

LumberJack
07-12-2012, 12:42
Il mio problema riformulato con camion e' il seguente: E se il camion dev andare per forza in ameno due destinazioni (2,N). Come faccio a vincolarlo in SQL?

mattxx88
07-12-2012, 12:59
ah ok, però bisogna vedere che parco macchine deve gestire sta cosa (io con 50 mezzi a memoria ancora me la cavo) e poi, il camion fa sempre le solite fermate?
forse non ho capito bene che tipo di lavoro fate voi, ma io i miei per tenerli d'occhio ho dei sistemi gps con integrato un sistema "report" so in una determinata data dove è stato, che ordini ha avuto (perche gli mandiamo gli ordini tramite un display installato nel mezzo), che fermate e per quanto tempo è stato fermo ecc ecc. sto data base che vuoi fare non riesco a capire se si basa su eventi passati, o eventuali (futuri)

LumberJack
07-12-2012, 13:14
ah ok, però bisogna vedere che parco macchine deve gestire sta cosa (io con 50 mezzi a memoria ancora me la cavo) e poi, il camion fa sempre le solite fermate?
forse non ho capito bene che tipo di lavoro fate voi, ma io i miei per tenerli d'occhio ho dei sistemi gps con integrato un sistema "report" so in una determinata data dove è stato, che ordini ha avuto (perche gli mandiamo gli ordini tramite un display installato nel mezzo), che fermate e per quanto tempo è stato fermo ecc ecc. sto data base che vuoi fare non riesco a capire se si basa su eventi passati, o eventuali (futuri)

Puoi decidere tu facendo degli aggiornamenti su quali fermate deve fare il tuo mezzo. Diciamo che il gps e' il mezzo con cui fai le rilevazioni e il sistema ti da il report della giornata o piu giornate di quel camion, inoltre puoi aggiornare le destinazioni come hai detto tu. Si diciamo che sei già apposto e non ti servirebbe un db, dato che solitamente vengono usati per archiviare (quindi eventi passati o già pianificati). Il tuo sistema fa già tutto, ma potresti sbizzarirti quanto vuoi. Per esempio crei una entità DIPENDENTE, un entità REPORT-GPS e le associ. Potresti sapere in un determinato giorno chi ha guidato il camion e che fermate a fatto e in quali ore. Tutto bello registrato se qualcuno dovesse fare il furbetto e te ne accorgi dopo:)

PS: L'esempio della ditta autotrasporti e solo uno dei tanti. Prendi per esempio un negozio di prodotti alimentari. Vorresti tenere traccia dei prezzi dei prodotti, della quantità in magazzino di un prodotto oppure quanti pezzi di un prodotto sono stati comprati in un determinato giorno. Le possibilità sono infinite, ma con un buon db modellato, puoi tener traccia di tutto e di più. Per fare bilanci, statistiche ecc..

mattxx88
07-12-2012, 13:32
Puoi decidere tu facendo degli aggiornamenti su quali fermate deve fare il tuo mezzo. Diciamo che il gps e' il mezzo con cui fai le rilevazioni e il sistema ti da il report della giornata o piu giornate di quel camion, inoltre puoi aggiornare le destinazioni come hai detto tu. Si diciamo che sei già apposto e non ti servirebbe un db, dato che solitamente vengono usati per archiviare (quindi eventi passati o già pianificati). Il tuo sistema fa già tutto, ma potresti sbizzarirti quanto vuoi. Per esempio crei una entità DIPENDENTE, un entità REPORT-GPS e le associ. Potresti sapere in un determinato giorno chi ha guidato il camion e che fermate a fatto e in quali ore. Tutto bello registrato se qualcuno dovesse fare il furbetto e te ne accorgi dopo:)

PS: L'esempio della ditta autotrasporti e solo uno dei tanti. Prendi per esempio un negozio di prodotti alimentari. Vorresti tenere traccia dei prezzi dei prodotti, della quantità in magazzino di un prodotto oppure quanti pezzi di un prodotto sono stati comprati in un determinato giorno. Le possibilità sono infinite, ma con un buon db modellato, puoi tener traccia di tutto e di più. Per fare bilanci, statistiche ecc..
Arrivano cmq a intralciarti/farsi i cazzi loro gli autisti fidati.. :muro:

ad ogni modo, molto interessante come cosa, hai un bel lavoro da fare a posteriori cmq! mi sono sempre chiesto se qui dentro qualcuno facesse un lavoro come il mio :D fine ot cmq, grazie per le spiegazioni!

banryu79
07-12-2012, 13:58
Il problema e': quando creo fisicamente le tabelle in sql come faccio con un CONSTRAINT a vincolare il fatto che se non esistono almento due tuple di (linea,fermata,progressivo) con la stessa linea allora quella linea non puo' essere usata come dato?

@LumberJack: http://stackoverflow.com/questions/10345461/how-to-enforce-constraint-in-sql
Di solito queste logiche sono lato applicazione, oppure puoi usare una stored procedure.

LumberJack
07-12-2012, 14:39
@LumberJack: http://stackoverflow.com/questions/10345461/how-to-enforce-constraint-in-sql
Di solito queste logiche sono lato applicazione, oppure puoi usare una stored procedure.

Yeah! Grazie mille!:)

british
08-12-2012, 00:47
Salve a tutti.
Sto realizzando un db su una ditta di autotrasporti e ho un dubbio su una relazione fra due entita'.
La prima entita' e' LINEA (con codice identificativo id_linea) e la seconda e' FERMATA (con codice identificativo id_fermata). Ora entrambe sono associate ad una relazione COMPOSTA che vede dalla parte di FERMATA una cardinalita' (1,N), mentre dalla parte di LINEA una cardinalita' (2,N). Questo perche' una LINEA dev'essere composta da almeno due fermate (quella d'inizio e quella di arrivo ed eventualmente da delle fermate intermedie).

Ora il mio schema logico e' il seguente:
LINEA(id_linea,...) FERMATA(id_fermata,...) COMPOSTA(linea, fermata, progressivo).
Con vincolo referenziale (fermata->id_fermata) (linea->id_linea)
e fin qui non ci piove.

Il problema e': quando creo fisicamente le tabelle in sql come faccio con un CONSTRAINT a vincolare il fatto che se non esistono almento due tuple di (linea,fermata,progressivo) con la stessa linea allora quella linea non puo' essere usata come dato?

Grazie in aticipo e spero di essere stato chiaro:)

Il modello logico delle tabelle dovrebbe essere il più possibile aderente al modello concettuale (E-R), addirittura dovrebbe essere da esso derivabile meccanicamente.
Quello che puoi fare è scorporare la relazione "Composta" in tre relazioni, tutte con cardinalità 1,N dal lato dell'entità "Fermata":
relazione "Capolinea A" con cardinalità 1,1 dal lato dell'entità "Linea"
relazione "Capolinea B" con cardinalità 1,1 dal lato dell'entità "Linea"
relazione "Fermate intermedie" con cardinalità 0,N dal lato dell'entità "Linea"

ciao!