|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#21 | |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
Quote:
|
|
|
|
|
|
|
#22 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Non penso che il professore analizzi a sufficienza il tuo modello tanto da chiederti perche' nel feedback hai messo in chiave sia oggetto che destinatario. Penso che tu stia commettendo un altro errore, forse. Quale e' la chiave primaria della tabella Vende?
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
|
#23 | |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
Quote:
Cmq la chiave di VENDE per me è USER_ID di UTENTE e ID_OGGETTO di INSERZIONE. Mi dovrebbe identificare in maniera univoca e mi dovrebbe collegare senza problemi le due entità in quanto ogni volta che un utente vende un oggetto questo viene inserito in INSERZIONE la cui chiave sarà un id numerico di tipo auto increment. E un utente non potrà mai vendere 2 volte lo stesso oggetto. |
|
|
|
|
|
|
#24 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Ma quello che vorrei passarti e' che la chiave primaria di Vende, secondo me dovrebbe essere solamente Oggetto. Un oggetto e' messo in relazione con un utente una volta sola, pertanto ogni Oggetto non dovrebbe comparire MAI piu' di una volta in quella tabella. Ed e' questo il motivo per cui in fase di modellazione si potrebbe tranquillamente fondere questa tabella all'interno della tabella oggetto. Perche' dovrebbero avere fisicamente la stessa chiave primaria. La relazione verso l'utente ovviamente ci sarebbe, ma non identificativa. L'utente non dovrebbe essere messo in chiave, pur avendo una chiave straniera verso la tabella degli utenti. Sono riuscito a spiegarmi? Non sei d'accordo? La vera schematizzazione, che se guardi ho sbagliato anche io nel veloce disegno che ho fatto, e' che la linea tra utente e vende dovrebbe essere tratteggiata. Comunque direi che va bene per la feedback ternaria. A questo punto lascia anche la Vende binaria altrimenti il professore potrebbe mangiare la foglia.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
|
#25 |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
Ciao,
rieccomi quà a rompere le scatole. Visto che la relazione VENDE è una relazione di tipo UNO A MOLTI, dici che è meglio eliminarla ed inserire la chiave di UTENTE (USER_ID) dentro l'entità INSERZIONE, così eliminerei una tabella e cmq avrei il vincolo di integrità referenziale che punta da INSERZIONE ad UTENTE. Invece l'altra cosa importante è la relazione VENDITA, altra relazione uno a molti. Tale relazione in pratica serve a contenere le vendite effettuate e lega un utente del sistema con il prodotto da lui acquistato. Dal momento che la cardinalità minima dell'entità INSERZIONE che entra in gioco in questa relazione è 0 (in quanto su quel braccio la cardinalità è (0, 1)...credo di averlo dimenticato nell'ER postato) allora potrei anche mantenere una tabella VENDITA nello schema relazionale. che ne dici? |
|
|
|
|
|
#26 |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
mmm ancora un altro dubbio (ho quasi finito
Per le due relazioni feedback che voglio mantenere come relazioni...che chiavi metto? Avevo pensato che potrei impostare come chiave anche il solo ID_OGGETTO...secondo te potrebbe andare? (senza mettere in chiave l'ID dell'utente venditore e dell'acquirente...che magari metto come campi normali perchè credo che l'IDE_OGGETTO sia più che sufficiente ad identificarmi in maniera univoca una riga). Grazie Andrea |
|
|
|
|
|
#27 | ||
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Quote:
VENDITA, con chiave (Oggetto, Acquirente) (Forse sarebbe meglio chiamarla ACQUISTI) Attributi: data,... Non e' necessario mettere il Venditore, perche', come gia' detto, e' univocamente definito dall'oggetto.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
||
|
|
|
|
|
#28 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
La relazione verso l'acquirente non e' identificativa, non e' necessario metterla in chiave. Anche qui, essendo il venditore univocamente definito dall'oggetto, sarebbe superfluo metterlo in uno schema normalizzato. Se lo metti non e' un errore (denormalizzazione parziale) ma non lo metterei appunto in chiave.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
|
#29 |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
Ok ti rignrazio troppo...
Ora manca solo l'ultima relazione da tadurre: SUBCAT. Si tratta di una relazione ricorsiva tra l'entità CATEGORIA e se stessa. Praticamente dice quando una categoria è sottocategoria di un'altra. E' di tipo uno a molti in quanto una categoria può avere minimo 0 sottocategorie e massimo n e viceversa una sottocategoria può avere una ed una sola sola categoria padre. Adesso mi sorge un dubbio, passando allo schema relazionale è meglio mantenere una relazione SUBCAT che conterrà coppie, (ID_PADRE, ID_FIGLIA) che dicono chi è il padre di chi. Oppure potrei fare un accorpamento PADRE-FIGLIA ed inserire un campo PADRE dentro CATEGORIA che dice qual'è il padre di quella categoria e se la categoria in questione non ha padre (in quanto categoria principale) allora avrà un NULL (che a mio avviso non è troppo carino). Io tenderei a mantenere una relazione SUBCAT che mi contiene le varie coppie per evitare il fatto dei valori NULL...te che mi dici? Poi dopo di questa cosa ho finito di tradurre lo schema ER in relazionale Grazie Andrea |
|
|
|
|
|
#30 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Normalmente per casi come quello si usa una tabella sola.
Tassonomia: ID_tassonomia, chiave Descrizione, stringa ID_tassonomia_padre, FK alla tabella stessa, non obbligatorio E' il pattern che serve per modellare quello che in teoria dei grafi e' una FORESTA, ovvero un insieme di ALBERI. I nodi radice di ciascun albero sarebbero per te le "MacroCategorie", che non hanno padre. Ciascuno dei figli invece e' collegato al proprio padre, mediante il campo ID_tassonomia_padre. Applicativamente occorrera' poi sviluppare delle QUERY ricorsive per navigare la foresta, ma quasi tutti i motori di Database seri hanno il supporto per le query ricorsive. PS: Una foresta si puo' ridurre ad un albero unico, con un unico nodo padre. Ma tale padre non avrebbe comunque un padre, pertanto resta lo stesso il vincolo di non obbligatorieta' della foreign key autoreferenziale. Tale relazione, ovvero foreign key non referenziale e pure non obbligatorie, si modella nel grafico ER con una linea tratteggiata, e con un pallino vuoto vicino al campo di partenza (che sarebbe ID_TASSONOMIA_PADRE di questo esempio) Ma poi basta, senno' Cionci dice il voto lo danno a me.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#31 | |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
Quote:
|
|
|
|
|
|
|
#32 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Non sembra ricorsiva, ma lo e' lo stesso. Ma magari non se ne accorge. Sia nella singola tabella autoreferenziante che nel tuo disegno a 2 tabelle, per risolvere una domanda come: "DATO un nodo della foresta, trovare quale e' il suo ANCESTOR" che da te sarebbe "Dato una qualsiasi categoria, trovare a quale MACRO Categoria appartiene" Occorre comunque fare una query ricorsiva. E non penso neppure che le abbiate fatte, perche' sono delle brutte bestie.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
|
#33 | |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
Quote:
|
|
|
|
|
|
|
#34 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Stai proponendo di fare delle query autoreferenzianti, nelle quali piazzi piu' volte la stessa tabella in join con se stessa. Penso che non possa farlo "a priori" nel tuo modello, perche' dovresti sapere quante volte piazzare la tabella in JOIN con se stessa, che dipende dal livello di profondita' di ciascun nodo. Poiche' dipende dal livello di profondita', essendo il livello variabile per ciascun nodo, secondo me non riesci a fare un'unica query generale che possa funzionare a priori indipendentemente dal nodo che cerchi. Forse con delle OUTER JOIN, ma mi sa che non viene molto bella da farsi e da leggersi. Tutto dipende da cosa devi farci con quella tabella. A parte scriverci dentro, come la leggi? Cosa viene pubblicato di quella tabella? Se il tuo "sito" mostra una navigazione ad un livello solo, ovvero fa vedere di volta in volta tutti gli oggetti venduti che appartengono alla categoria corrente, e ti propone la navigazione verso il padre (se esiste) e verso uno qualsiasi dei suoi figli diretti (se esistono), allora non ti servono le query ricorsive. Te la cavi con 2 query normali. In tal caso una tabella come la soluzione da me proposta, oppure 2 tabelle come la tua, vanno entrambe bene.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
|
#35 |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
mmm mi sà che ho capito cosa intendi...praticamente te stai dicendo che facendo query di questo tipo usando gli alias potrei fare una query del tipo: "Dimmi tutte le categorie figlie della categoria "FOTOGRAFIA"".
Però usando questa strategia potrei dire quali sono le figlie dirette e non le figlie delle figlie, etcetc....intendi questo? mmm e se mi tengo la relazione SUBCAT dici che è una porcata? Grazie Andrea |
|
|
|
|
|
#36 | |||
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
ES: Se sul tuo sito volessi mostrare tutte gli oggetti venduti da una categoria e conteporaneamente anche da tutte le sue categorie figlie, nipoti, etc... allora dico che senza le query ricorsive non ne esci. Prova a chiedere alla tua Professoressa, alle quali non piacciono, come risolverebbe questo problema, che modello e che query farebbe. Se la risposta fosse "Lancio una query che mi da tutti i figli, e per ciascuno di questi rilancio poi la stessa query", allora e' un altro modo per fare "male" una query ricorsiva Quote:
Quote:
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|||
|
|
|
|
|
#37 |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
vabbuò...vado a pappare e spero che il pranzo mi porti anche saggezza
|
|
|
|
|
|
#38 |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
Quindi ricapitolando te accorperesti la relazione SUBCAT dentro CATEGORIA e metteresti il campo Padre dentro CATEGORIA così da sapere per ogni record (quindi per ogni categoria) chi è la categoria padre di quel record per qvere una cosa del genere
ID_CATEGORIA, NOME_CAT, DESCRIZIONE PADRE 001, HOBBY, blablabla, NULL 006, FOTOGRAFIA, blablabla, 001 Intendevi questo? Grazie Andrea |
|
|
|
|
|
#39 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
001, Hobby, null 002, Fotografia, 001 003, Bricolage, 001 004, Informatica, null 005, Hardware,004 006, Software,004 007, Canon, 002 008, Konika, 002 etc. Puoi sapere subito tutto dei figli diretti di 002 SELECT * FROM tabella WHERE padre=002 E puoi sapere tutto del padre SELECT * FROM tabella WHERE ID = (SELECT padre FROM tabella WHERE ID=002) oppure se non vi hanno spiegato le inner query lo fai con la INNER JOIN SELECT tab1.* FROM tabella AS tab1 JOIN tabella AS tab2 ON (tab1.ID=tab2.padre) WHERE tab2.ID=002
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
|
#40 |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
mmm no Descrizione è solo un campo di Categoria e non è legato al Padre (forse mi son mangiato una virgola).
Nel senso se il titolo della categoria è: "Fotografia" la sua descrizione sarà un campo testuale che ne sò qualcosa del tipo: "Inserzioni relative alla fotografia: macchine fotografiche, flash e attrezzatura fotografica di vario genere". Ho appena finito di tradurre lo schema relazionale. Dici che è decente qualcosa del genere? (Le chiavi sono con la pallina rossa, i campi con le palline nere). Dove le relazioni sono state eliminate aggiungendo un campo ad un'entità che punta ad un'altra entità ho messo la freccia. Dove non le ho eliminate ho lasciato la relazione con relative cardinalità che di fatto nello schema relazionale è una tabella. ![]() Grazie Andrea |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:01.





















