 | |
Il progetto dsy.it è l'unofficial support site dei corsi di laurea del Dipartimento di Scienze dell'Informazione e del Dipartimento di Informatica e Comunicazione della Statale di Milano. E' un servizio degli studenti per gli studenti, curato in modo no-profit da un gruppo di essi. I nostri servizi comprendono aree di discussione per ogni Corso di Laurea, un'area download per lo scambio file, una raccolta di link e un motore di ricerca, il supporto agli studenti lavoratori, il forum hosting per Professori e studenti, i blog, e molto altro...
In questa sezione è indicizzato in textonly il contenuto del nostro forum |
Progetto Basi 2011/2012 Clicca QUI per vedere il messaggio nel forum |
pintu |
Apro questo thread nella speranza che sia di aiuto per tutti quelli che devono fare il progetto di basi di dati! Magari scambiandoci info, conoscenze ecc possiamo aiutarci tutti quanti a finire questo benedetto progetto! Qualcuno lo ha già iniziato?? Domanda stupida...se ho la presenza di 3 categorie (utente reg, utente nonreg, admin) dovrò avere una tabella anche per questi nel mio database o è una cosa completamente a parte legata solo al php??? |
SanJuanWolf89 |
certo!!per amministratore e per utente registrato sicuramente , per quanto riguarda l ultente non registrato no perche non deve esserci login..in poche parole l ultente non registrato è il visitatore occasionale quindi non deve esseere identificato da nulla |
xSharKMaNx |
quanto tempo si ha a disposizione per fare il progetto? |
xSharKMaNx |
dove trovo la traccia del progetto?
mentre per quanto riguarda l'orale ?
Grazie Maddy |
pintu |
Originally posted by SanJuanWolf89
certo!!per amministratore e per utente registrato sicuramente , per quanto riguarda l ultente non registrato no perche non deve esserci login..in poche parole l ultente non registrato è il visitatore occasionale quindi non deve esseere identificato da nulla
Mmmm non mi è chiaro :( nel senso...io nel mio database avrò per esempio una tabella UTENTI con attributi: nome (es: pippo) e tipoUser (es: admin)...ma in che modo la tabella è collegata alle altre nel database?? |
number15 |
Hai fatto il diagramma ER?
Da lì vedi i collegamenti tra le varie tabelle.
A livello logico le tabelle saranno poi 'collegate' dalla chiavi esterne.
A livello applicativo la tabelle utente ti servirà anche per mostrare/offrire funzionalità diverse a seconda della tipologia di utente |
SanJuanWolf89 |
Allora:
tabella utenti registrati(
dati.. (id login e password)
)
taabella amministratore(
dati...
)
tabella annuncio(
dati tra cui riferimento all'utente che l ha pubblicato, ovvero riferimento alla tabella utente registrato
)
in poche parole ogni annuncio viene pubblicato da un utente nella tabella annuncio avrai una colonna utente |
number15 |
Che dati andresti a mettere in AMMINISTRATORE? |
pintu |
Ma (ai fini del progetto) io dovrei creare degli utenti fittizi nella mia base di dati oppure devo poter aggiungere degli utenti? Nel senso...ok un utente registrato pubblica un annuncio e quindi quel determinato annuncio si riferisce all'utente che l'ha pubblicato. Ma per gli utenti che visitano semplicemente la base di dati ( e che quindi non hanno nessun riferimento alla tabella annunci) deve essere creata una tabella a parte?? Nella tabella amministratore io metterei semplicemente la mia user e la mia password dato che presuppongo di essere l'unico amministratore del mio DB o no? |
number15 |
La popolazione del database viene ovviamente fatta 'a monte'.
Il fase di discussione del progetto però il prof. può chiedere l'iscrizione di un utente al sito attraverso il form di registrazione.
A quel punto ovviamente l'utente andrà salvato.
Non so se son previsti pannelli per poter inserire annunci. Il tal caso potrebbe chiederti di inserire un annuncio e di associarlo ad un utente.
Per i visitatori, quindi utenti NON registrati, che dati andresti a salvare in una tabella?
Per quale motivo per salvarti la user e la password dell'admin creeresti una tabella amministratore?
Ps. sto cercando di farti(vi) ragionare. Se preferisci risposte più dirette e 'concrete' dimmelo ;) |
pintu |
Gentilissimo :) Comunque in effetti io non creerei una tabella amministratore, era per rispondere alla domanda che hai rivolto a SanJuanWolf89! Io creerei una tabella UTENTE con attributi nomeUser, password, tipoUser. nomeUser diventerebbe chiave esterna per il collegamento con la tabella ANNUNCIO, mentre tipoUser (che avrebbe dominio: user, admin) servirebbe per individuare il ruolo dell'utente all'interno del database. Può essere una soluzione sensata? |
pintu |
PS: comunque appena terminerò lo schema ER lo posto e approfitterò nuovamente della tua pazienza per eventuali consigli :) |
number15 |
È ovviamente la soluzione corretta ;-)
Un consiglio: utilizza sempre un campo intero (int, smallint ecc) AUTO INCREMENT come identificativo/chiave primaria ed eventualmente metti come UNIQUE username o mail o entrambi (non la coppia).
Quando devi poi creare delle chiavi esterne, avrai degli int da confrontare e non delle stringhe.
Come prestazioni c'è un abissso! |
pintu |
quindi aggiungo alla tabella UTENTE un campo id (integer) che fa riferimento alla tabella annunci? |
number15 |
Si.
TI faccio un esempio ("pseudocodice"):
UTENTE(id_utente, username, password, email, tipo_utente);
id_utente MEDIUMINT AUTO_INCREMENT;
PK(id_utente);
UNIQUE(email);
UNIQUE(username);
ANNUNCI(id_annuncio, xxx,xxx, id_utente);
FK(id_utente) REFERENCES utente(id_utente);
E' l'id_utente in annunci che fa riferimento ad utente e non il contrario ;) |
pintu |
Come sempre grazie per le risposte e la pazienza :) Mi potresti spiegare che differenza ci sarebbe se fosse il contrario??
PS: ho scaricato e installato apache sul mio portatile. Ora per completare l'opera dovrei scaricare php , postgres e phppgadmin per poter lavorare nello stesso ambiente del laboratorio di DB. Qualcuno riesce a trovare un link decente per scaricare php?? Non riesco a trovare nessun installer, solo file zip pieni di cartelle e altri file php e sinceramente non so cosa farne -.- |
number15 |
Semplicemente tu la chiave esterna la metti su una chiave peimaria di un altra tabella. Quindi tu crei id_utente in Utente come chiave primaria mentre id_utente in Annunci è chiave esterna riferita a id_utente in Utente. Questo garantisce che ogni annuncio sia associato ad un utente esistente nella base di dati. |
CowBoy |
Non riesco a trovare nessun installer, solo file zip pieni di cartelle e altri file php e sinceramente non so cosa farne -.- Scarica il zip e leggi con attenzione il README... prima di aprirlo libera un paio di chakra. Io avevo usato php 5.3.
Per scaricare php vai su http://www.php.net/downloads.php
Se usi WinOS vai su http://windows.php.net/download/
Ogni versione ha delle piccole accortezze, ma una volta letto con calma il README (meglio se due volte) l'installazione e l'integrazione dell'intero sistema(apache+postgres) dovrebbe essere facile ed immediata.
Ciao |
pintu |
@number15: tutto chiaro grazie :)
@cowboy: apache è installato e funzionante. Avevo gia scaricato lo zip di php per windows, estratto i file all'interno di una cartella che ho chiamato php, e messo la cartella in C:\ . Ho trovato una guida sull'installazione di apache-php-postgres..secondo questa all'interno del mio zip dovrei avere un file php5ts.dll (che manca) che va messo nella cartella WINDOWS. C'è scritto poi di editare il file httpd.conf (nella cartella apache) inserendo 3 righe di codice. Seguo tutte le istruzioni alla lettera ma il mio simpaticissimo portatile mi dice che non posso editare il file httpd.conf perchè non riesce a trovare il path :( :( penso di essere vicino all'esaurimento! |
CowBoy |
hehe... te l'ho detto di liberare un paio di chakra :)
L'installazione all'inizio sembra complicata, dagli un'altra chance. Nel frattempo vedo se riesco a trovare il materiale del progetto dove ho tenuto un diario dell'istallazione ;) |
CowBoy |
Il file httpd.conf lo trovi (normalmente, per la versione 2.2) sotto:
C:\Programmi\Apache Software Foundation\Apache 2.2\conf\
Quindi vai sul Prompt, posizionati sulla cartella conf e scrivi:
notepad httpd.conf > invio
Al file di configurazione io ho aggiunto le seguenti 5 righe:
LoadModule php5_module "PHPinstallDIR/php5apache2.dll"
AddType application/x-httpd-php .php
PHPIniDir "PHPinstallDIR"
DocumentRoot "C:/prog"
LoadFile C:/Programmi/PostgreSQL/8.4/bin/libpq.dll
La riga Document root era dove io avevo i file del mio progetto. Attenzione anche alle cartelle nominate secondo le versioni, le mie e le tue non coincidono.
Se, come me, hai estratto i file di php sotto C:\php allora:
1- copia il file php.ini-recommended (del zip) nella cartella di estrazione
2- copia le seguenti librerie nella cartella di estrazione(ricontrollare le versioni):
- fdftk.dll
- libmysql.dll
- php5apache2_2.dll
- php5ts.dll
3- copiare il contenuto della cartella ext nella cartella [/b]extensions[/b]
4- modificare il contenuto di php.ini (il file al punto 1, rinominato) come segue, alcune voci sono presenti nel file:
include_path = "PHPinstallDIR\includes"
extension_dir = "PHPinstallDIR\extensions"
extension = php_mysql.dll
extension = php_pgsql.dll
extension = php_xsl.dll
5- riavvia il sistema (anche se fai delle modifiche minori)
Buon progetto! |
pintu |
Grazie per la spiegazione CowBoy! :) |
SanJuanWolf89 |
Rispondo a pintu...se fosse il contrario ogni utente sarebbe collegato a un solo annuncio invece ogni utente puo pubblicare qnt annuncio vuole..
Per quanto riguarda gli utenti non registrati io nn ho fatto alcuna tabella xk nn sn necessarie credenziali per verificarne l'accesso.
Per l amministratore invece si perche cmq l amministratore anche se uno solo ha un login e una password
Infine rispondo a number15..non sono daccordo sulla tua decisione d mettere come primary key l'id utente..io ho messo come primary key il nome dell'utente proprio cm succede qnd t registri da qualche parte...quello che è unico è il nome dell'utente e se e gia occupato da qlkn altro risulta non disponibile |
pintu |
Dal testo del progetto:
"Utente registrato. Ha accesso al sistema mediante credenziali e può pubblicare annunci. Gli utenti registrati possono essere privati o agenzie. Il contatto dell'utente registrato che ha pubblicato l'annuncio è sempre visibile mentre l'insieme completo dei dati di registrazione di un utente è disponibile per la consultazione solo da parte degli amministratori del sistema."
1) "Gli utenti registrati possono essere privati o agenzie."
E' una richiesta che comporta le opportune modifiche al dbms o no? Nel senso...nella mia tabella UTENTE potrò avere 'gli utenti pinco pallino' e 'azienda srl' senza preoccuparmi del fatto che uno sia un privato e l'altro un azienda o secondo voi è necessario aggiungere alla tabella l'attributo 'tipoUtente' con dominio (privato, azienda)??
2)"Il contatto dell'utente registrato che ha pubblicato l'annuncio è sempre visibile mentre l'insieme completo dei dati di registrazione di un utente è disponibile per la consultazione solo da parte degli amministratori del sistema."
Ciò significa che un (utente registrato e non) può sapere solo che un certo annuncio è stato pubblicato da 'pincopallino' mentre l'amministratore può vedere tutte le info come nome, cognome, password?
So che sono domande banali ma prima di mettermi a smanettare volevo avere delle certezze su come impostare le tabelle :) |
number15 |
Originally posted by SanJuanWolf89
Infine rispondo a number15..non sono daccordo sulla tua decisione d mettere come primary key l'id utente..io ho messo come primary key il nome dell'utente proprio cm succede qnd t registri da qualche parte...quello che è unico è il nome dell'utente e se e gia occupato da qlkn altro risulta non disponibile
Ciao, è ovviamente giusto anche la tua scelta ma pensa all'alla gestione/ottimizzazione di un database.
Ad esempio con la tua scelta la chiave esterna in annuncio sarà un varchar(20) mentre potrebbe essere uno smallint unsigned.
Quindi le join saranno molto più 'pesanti'.
Per indicare come unico un campo si usano gli indici Unique: in questo caso puoi farne due, uno per username e uno per email.
In ogni caso i controlli saranno gestiti dall'applicazione web e non dal database, cioè prima del db sarà l'applicazione a dirti che esiste già un utente con quello username. |
number15 |
Originally posted by pintu
Dal testo del progetto:
"Utente registrato. Ha accesso al sistema mediante credenziali e può pubblicare annunci. Gli utenti registrati possono essere privati o agenzie. Il contatto dell'utente registrato che ha pubblicato l'annuncio è sempre visibile mentre l'insieme completo dei dati di registrazione di un utente è disponibile per la consultazione solo da parte degli amministratori del sistema."
1) "Gli utenti registrati possono essere privati o agenzie."
E' una richiesta che comporta le opportune modifiche al dbms o no? Nel senso...nella mia tabella UTENTE potrò avere 'gli utenti pinco pallino' e 'azienda srl' senza preoccuparmi del fatto che uno sia un privato e l'altro un azienda o secondo voi è necessario aggiungere alla tabella l'attributo 'tipoUtente' con dominio (privato, azienda)??
2)"Il contatto dell'utente registrato che ha pubblicato l'annuncio è sempre visibile mentre l'insieme completo dei dati di registrazione di un utente è disponibile per la consultazione solo da parte degli amministratori del sistema."
Ciò significa che un (utente registrato e non) può sapere solo che un certo annuncio è stato pubblicato da 'pincopallino' mentre l'amministratore può vedere tutte le info come nome, cognome, password?
So che sono domande banali ma prima di mettermi a smanettare volevo avere delle certezze su come impostare le tabelle :)
1) attributo tipo mettilo sempre: guarda poi se in base al tipo di utente ci sono informazioni diverse.
2) direi che non c'entra con db ma con applicazione. Comunque direi che psw non la vede neanche l'admin. Contatto credo sia email o telefono. |
pintu |
Non avevo minimamente pensato a "contatto" in quel senso ahah xD Comunque volevo lasciarla visibile all'admin così se un utente l'ha dimenticata in qualche modo si recupera :D |
number15 |
Se scegli di non criptare allora sì, altrimenti ne dovresti creare una nuova in caso di dimenticanza. |
SanJuanWolf89 |
Originally posted by number15
Ciao, è ovviamente giusto anche la tua scelta ma pensa all'alla gestione/ottimizzazione di un database.
Ad esempio con la tua scelta la chiave esterna in annuncio sarà un varchar(20) mentre potrebbe essere uno smallint unsigned.
Quindi le join saranno molto più 'pesanti'.
Per indicare come unico un campo si usano gli indici Unique: in questo caso puoi farne due, uno per username e uno per email.
In ogni caso i controlli saranno gestiti dall'applicazione web e non dal database, cioè prima del db sarà l'applicazione a dirti che esiste già un utente con quello username.
hai ragione hhahah anke s nn ho voglia d rimodificare tutto
cmq ho una domanda ..nel testo viene detto che ogni categoria puo avere caratteristiche ..in che senso??? |
number15 |
Guarda tipo attico.it che ha tipologie/categorie. Probabilmente ti aiuta. |
SanJuanWolf89 |
Originally posted by number15
Guarda tipo attico.it che ha tipologie/categorie. Probabilmente ti aiuta.
Si ma c sono i nomi ma non caratteristiche..io nel mio progetto ho creato semplicemente una tabella categoria con attributo nome categoria con una decina d tuple.. |
number15 |
Ho riguardato meglio ed in effetti la prof divide diversamente rispetto al sito.
Non mi viene in mente nessuna caratteristica che avrebbe senso tabellare referita a categoria.
Dato che non è chiaro dalle specifiche io farei la divisione come attico.it usando categoria come categoria e tipologia come caratteristiche |
SanJuanWolf89 |
Originally posted by number15
Ho riguardato meglio ed in effetti la prof divide diversamente rispetto al sito.
Non mi viene in mente nessuna caratteristica che avrebbe senso tabellare referita a categoria.
Dato che non è chiaro dalle specifiche io farei la divisione come attico.it usando categoria come categoria e tipologia come caratteristiche
Cmq ho pensato alla questione di creare una tabella solo x l'amministratore..se aggiungo una colonna a utente per identificarne il tipo vuol dire che ogni tupla di utente avra un attributo in piu..quindi in termini di spazio è molto piu pesante secondo me in quanto devo memorizzare tutti gli attributi tipo_utente invece se creo una sola tabella x l'amministratore risparmio in spazio no?? |
number15 |
La tua idea era di fare due tabelle identiche divise, una UTENTE e UNA ADMIN?
No, creeresti una tabella con n campi in più 'inutili'.
In ogni caso parliamo di sottigliezze, un campo in più o in meno non cambia assolutamente niente.
Il problema è che è strutturalmente sbagliato crearti due tabelle.
Tra l'altro a livello applicativo per estrarre le informazioni di un utente, non sapendo se è admin o utente normale, dovresti andarlo a cercare in due tabelle diverse?
Ragiona a livello concettuale: se i tipi di utenti fossero 4 (utente, admin, moderatore, gestore) faresti 4 tabelle? |
SanJuanWolf89 |
Originally posted by number15
La tua idea era di fare due tabelle identiche divise, una UTENTE e UNA ADMIN?
No, creeresti una tabella con n campi in più 'inutili'.
In ogni caso parliamo di sottigliezze, un campo in più o in meno non cambia assolutamente niente.
Il problema è che è strutturalmente sbagliato crearti due tabelle.
Tra l'altro a livello applicativo per estrarre le informazioni di un utente, non sapendo se è admin o utente normale, dovresti andarlo a cercare in due tabelle diverse?
Ragiona a livello concettuale: se i tipi di utenti fossero 4 (utente, admin, moderatore, gestore) faresti 4 tabelle?
Amministratore e utente nn sn identiche, t lo scrivo in pseudocodice
table utente(
id_login, password, data registrazione, nome, cognome, email)
table amm(
id_login, password, email)
il fatto e che qnd l'amministratore vuole loggarsi l'applicazione va direttamente a cercare nella tabella amministratore (select * from amministratore) mentre se c si logga cm utente si cerca nella tabella utenti (select * from utente) mentre per l'utente non reg saremo senz'altro daccordo sul fatto che non servono credenziali.. cmq la mia idea è quella d creare due tabelle proprio per scindere i due ruoli e inoltre ora che m c hai fatto pensare si risparmi anke spazio in memoria a causa dui quell' attributo tipoUtente mentre con due tabelle non servirebbe piu..forse mi sbaglio di brutto ed e importante che c stiamo ragionando ma nn capisco proprio perchè dici che e concettualmente sbagliato creare due tabelle......se servono percjè nn crearle... |
number15 |
È concettualmente sbagliato perché admin è sempre un utente.
Guardati il concetto di generalizzazione/specializzazione su slide o libro.
Puoi dividerle, ma devi tenere una stessa tabella i base. Puoi fare così se hai molti campi diversi:
UTENTE (id_utente, username, email, password, tipo_utente)
UTENTE_INFO(id_utente, nome, cognome, telefono, data_registrazione)
Dove id_utente nella seconda tabella è fk su id_utente nella prima.
Quello che vuoi far tu in fase di login non è fattibile: non sai a monte dove cercare l'utente, ma devi ogni volta cercarlo in due tabelle.
Idem per registrazione, dovrai prima cercare in entrambe le tabelle se esiste o meno un utente con quella email.
Ps: lascia perdere attualmente il discorso della memoria perché prima deve essere corretto logicamente e poi ottimizzi. Tra l'altro si potrebbe discutere se occupa di più un campo aggiuntivo in una grossa tabella rispetto ad una nuova tabella da 3 campi con molte meno righe. |
pintu |
Originally posted by number15
Quello che vuoi far tu in fase di login non è fattibile: non sai a monte dove cercare l'utente, ma devi ogni volta cercarlo in due tabelle.
Idem per registrazione, dovrai prima cercare in entrambe le tabelle se esiste o meno un utente con quella email.
Secondo me è proprio questo il fulcro della discussione (lasciando perdere costi, ottimizzazioni ecc). Avendo un unica tabella, con attributo tipoUser, quando verrà affettuato il login la SELECT verrà fatta per forza sull'unica relazione UTENTE. Penso che la imposterò cosi.. |
number15 |
E' sicuramente la scelta corretta.
Ti permette anche di fare cose del tipo:
if (tipo_user == 'admin')
......
else echo('non hai permessi per vedere la pagina');
Poi puoi scegliere se splittare le informazioni non comuni ad entrambe le tipologie di utente in un'altra tabella, ma dato il rapporto utenti/admin direi che un'unica tabella con alcuni valori NULL è la scelta migliore. |
SanJuanWolf89 |
mmmm..forse avete ragione..cmq provero a chiedere anche al prof cosa ne pensa..intanto provo a modificarlo cm avete detto...
un altra domanda..
x il tipo contratto ovvero affito o vendita avete creato una tabella?? |
pintu |
quindi secondo te è meglio cosi..
UTENTE(id_utente, username, password, tipoUtente, nome, cognome, email)
di cosi per esempio?
UTENTE(id_utente, username, password, tipoUtente)
INFO_UTENTE(id_u, nome, cognome, email, telefono)
[id_u FK on id_utente]
?? |
number15 |
Originally posted by SanJuanWolf89
mmmm..forse avete ragione..cmq provero a chiedere anche al prof cosa ne pensa..intanto provo a modificarlo cm avete detto...
un altra domanda..
x il tipo contratto ovvero affito o vendita avete creato una tabella??
Hai fatto lo schema ER? Queste scelte si prendono in base allo schema quando vai poi a trasformarlo in relazionale.
Ps. non sto facendo il progetto io, quindi non riesco ad essere più specifico.
Originally posted by pintu
quindi secondo te è meglio cosi..
UTENTE(id_utente, username, password, tipoUtente, nome, cognome, email)
di cosi per esempio?
UTENTE(id_utente, username, password, tipoUtente)
INFO_UTENTE(id_u, nome, cognome, email, telefono)
[id_u FK on id_utente]
??
Si, sicuramente.
Come detto il rapporto tra utenti/admin non vale la creazione di una nuova tabella.
Diciamo che su 100 utenti avrai a dir tanto 3 admin (e il rapporto sarà sempre inferiore al crescere degli utenti), quindi puoi tranquillamente mettere a NULL i campi nome, cognome, telefono agli admin (nulla comunque ti vieta di compilarli anche agli admin). |
pintu |
@SanJuanWolf89: io ho messo l'attributo "contratto" nella tabella annuncio e ho creato la tabella CONTRATTO con due attributi...codice_contratto e tipo_contratto. Però non so mi sembra uno spreco..Alla fine i tipi di contatto sono solo affitto e vendita..Quindi magari sarebbe più sensato dare all'attributo contratto quel dominio! Io ne ho creata una a parte per la categoria |
pintu |
Infatti! Anzi in qualche caso potrebbe anche essere comodo sapere nome-cognome dell'admin! Guardando il progetto come un applicazione per tutti e non solo per il buon esito dell'esame! |
SanJuanWolf89 |
Originally posted by pintu
@SanJuanWolf89: io ho messo l'attributo "contratto" nella tabella annuncio e ho creato la tabella CONTRATTO con due attributi...codice_contratto e tipo_contratto. Però non so mi sembra uno spreco..Alla fine i tipi di contatto sono solo affitto e vendita..Quindi magari sarebbe più sensato dare all'attributo contratto quel dominio! Io ne ho creata una a parte per la categoria
Guarda è vero che puo sembrare uno spreco xo nella parte realtiva ai raggruppamenti se fai cm ho fatto io ovvero raggruppare x tipologia contratto e costo ti torna parecchio utile..nn saprei come farlo senza una tabella apposta quindi vada x la tabella tipocontratto |
number15 |
Originally posted by pintu
@SanJuanWolf89: io ho messo l'attributo "contratto" nella tabella annuncio e ho creato la tabella CONTRATTO con due attributi...codice_contratto e tipo_contratto. Però non so mi sembra uno spreco..Alla fine i tipi di contatto sono solo affitto e vendita..Quindi magari sarebbe più sensato dare all'attributo contratto quel dominio! Io ne ho creata una a parte per la categoria
Prendilo con le pinze perché come detto non sto facendo il progetto, quindi ho una visione relativa dell'insieme, però potrebbe essere uno spunto.
Direi che la tabella contratto per la tipologia di annuncio è superflua, visto che non ha attributi particolari. Lo vedrei più come un equivalente di tipo_utente (quindi campo enum('affitto', 'vendita').
ANNUNCIO(id_annuncio, titolo, descrizione, tipo_contratto, id_pubblicatore_annuncio, id_unita_immobiliare, prezzo, data_pubblicazione, data_scadenza)
Eventualmente:
AFFITTO(id_annuncio, attributi_esclusivi_di_affitto)
VENDITA(id_annuncio, attributi_esclusivi_di_vendita)
Ripeto, solo a fini di discussione, non so poi se i campi son corretti (cardinalità ecc). |
pintu |
Aspè non ho capito..ti riferisci alla parte dei criteri di similarità? |
number15 |
No, parlo in generale.
Ps. mandami pm con msn o skype che se vuoi dopo pranzo ti aggiungo e ti chiarisco un paio di cose, così velocizziamo la discussione (oggi pomeriggio devo per forza mettermi a far progetto di algo :( ) |
pintu |
la domanda era riferita a SanJuanWolf89 :D Per quello che gli hai risposto tu sono d'accordo sul fatto che sia abbastanza inutile la tabella CONTRATTO anche se io l'ho fatta all'inizio.. Cmq una volta terminato lo schema er e concettuale provo a fartelo vedere cosi magari uso i tuoi preziosi consigli :)
PS: è già uscito il progetto di algoritmi?? |
number15 |
Ah ok :D
Comunque se sei ancora alla schema ER basta che ci metti una croce sopra a CONTRATTO e bon :D
In generale comunque lo schema ER cerca di tenerlo il più semplice possibile... esplichi poi tutto meglio effettuando le dovute trasformazioni nel relazionale
Se ho tempo ti aiuto volentieri, è l'unico esame che mi è piaciuto e ho trovato utile.
PS: si, ultimo appello di Torelli per i fuoricorso. Il nuovo appello deve ancora uscire e prevede mi pare dei compitini. |
SanJuanWolf89 |
sisi cmq lo so k e abbastanza inutile xo mi e servita x la questione dei cluster..perchè ho deciso di raggruppare per tipo contratto e costo immobile quindi per definire i parametri mi serviva una tabella tipo contratto.. |
number15 |
Tecnicamente cosa intendete con cluster? SOn delle 'viste materializzate'?
In ogni caso mi sfugge come una tabella CONTRATTO, usata per specificare le tipologie di contratto possibili, ti possa risolvere di problemi... dovrai sempre avere una chiave esterna in ANNUNCIO per specificare il tipo di contratto su cui joinnare la tabella CONTRATTO.
A quel punto tanto vale usare un campo enum tipo_contratto in annuncio e arrivi alla stessa situazione. |
Shaper |
Ciao a tutti, mi aggiungo anch'io a questa conversazione e riporto l'attenzione sulla questione "categorie"
Non mi è molto chiaro cosa intende il testo quando scrive "Le categorie possono avere caratteristiche specifiche"
Per esempio la categoria "condominio" avrà la caratteristica "presenza del portiere", mentre quella "ufficio" avrà la caratteristica "numero di prese ethernet" (sto sparando a caso)?
Quindi in pratica la categoria influenza il numero e tipo di attributi di un annuncio?
Anche voi l'avete interpretata così? E nel caso come si descrive questa situazione mediante un diagramma ER o relazionale? |
number15 |
Ciao, dai un occhio alla pagina precedente in cui se n'è discusso un minimo.
La questione è spinosa. Io risolverei 'adattando' le specifiche (senza senso) ad una implementazione più sensata.
Dato che non è chiaro dalle specifiche io farei la divisione come attico.it usando categoria come categoria e tipologia come caratteristiche
Un paio di domande (sperando di non incasinarti ancora di più le idee :D)
Tu hai creato un'entità 'IMMOBILE' o fai tutto dentro ANNUNCIO?
Ad esempio se dovessi farlo io penserei ad una struttura del tipo:
IMMOBILE(id_immobile, lat, lon, indirizzo, id_città, id_categoria, ecc)
ANNUNCIO(id_annuncio, id_immobile, data di pubblicazione, titolo, descrizione, id_pubblicatore_annuncio, prezzo ecc)
Quindi io già di base molto probabilmente categoria la assocerei ad IMMOBILE e non ad ANNUNCIO.
Detto questo, per farlo come lo stai pensando tu valuterei queste possibilità:
- specializzazione di IMMOBILE in diverse tipologie, quindi vai a creare altre entità del tipo MONOLOCALE, BILOCALE, ATTICO, UFFICIO ecc oppure raggruppando mono, bilo, tri ecc sotto un'entità del tipo APPARTAMENTO con poi all'interno un campo tipo_appartamento.
In queste nuove tabelle ci saranno gli attributi esclusivi per le varie tipologie di immobile.
- unica tabella IMMOBILE con id_categoria e tutti i campi per le eventuali caratteristiche aggiuntive (che saranno NULL per le categorie non interessate).
Faccio esempio va: IMMOBILE(......, id_categoria, ha_ascensore(Y, N, NULL), ha_portineria(Y,N,NULL) ecc)
In più avrai la tabella CATEGORIA(id_cat, categoria), una tabella CARATTERISTICHE(id_cara, caratteristica) e una tabella che associa le caratteristiche alle opportune categorie (che puoi usare per vedere quali caratteristiche mostrare nel form a seconda della categoria)
Tutto comunque dipende da quali caratteristiche aggiuntive sensate si riescono a trovare e poi decidere:
1) se sono tante ed esclusive valuterei la prima opzione
2) se sono poche e/o comuni valuterei la seconda
Spero di essere stato abbastanza chiaro e che il tutto abbia senso :D |
Shaper |
Grazie, sei stato molto chiaro! :D
A naso io preferirei la seconda opzione, alla fine non dovrebbero venire fuori tante categorie diverse, né cambiare molto col tempo (pensando all'espandibilità) |
number15 |
Si, direi che è la scelta più sensata. ;)
Vedi tu se associarla ad annuncio o ad immobile, anche se le specifiche sembrano abbastanza propense verso annuncio, ma per me è sbagliato :D |
Shaper |
Originally posted by number15
Si, direi che è la scelta più sensata. ;)
Vedi tu se associarla ad annuncio o ad immobile, anche se le specifiche sembrano abbastanza propense verso annuncio, ma per me è sbagliato :D
Sì, infatti io ero partito con l'idea di fare tutto dentro ANNUNCIO, ma in effetti ora che mi ci fai pensare ha molto più senso dividere ANNUNCIO e IMMOBILE! |
number15 |
Nelle specifiche non sembra esser richiesto, ma mi sembra scelta saggia :D
Già solamente nel caso decidessi di mettere in vendita e in affitto lo stesso immobile oppure di rimettere in vendita lo stesso immobile dopo la scadenza del primo annuncio dovresti riscrivere in annuncio tutti i campi (che saranno una decina) relativi a quell'immobile (tra l'altro a rischio violazione della 3° forma normale)
Ma poi proprio concettualmente sono entità diverse! |
SanJuanWolf89 |
Ha tutto molto senso xo scusa quando un utente inserisce un annuncio cosa succede..si va a inserire una tupla sia in IMMOBILE, sia in ANNUNCIO??
La tua idea quindi e di tenere due relazioni,una x gli annunci visibili (ANNUNCIO) e una per tutti gli immobili..ma non si crea un po d confusione cosi??Soprattutto per quanto riguarda le funzioni di ricerca e di clustering. X me esce un po dagli schemi anke xk il testo parla esplicitamente di annuncio, cioe la fa mooolto piu facile di cosi anche se è un ottima idea. |
SanJuanWolf89 |
Guarda t propongo una soluzione
tabella annuncio(
id, titolo, citta, categoria, lat, lon, costo, prezzo, ecc ecc)
tabella caratteristiche(
id_annuncio, portineria, giardino, ecc ecc
)
in questo modo non suddividi troppo annuncio da immobile |
number15 |
Si, ovviamente si complica il tutto, ma è strutturalmente molto più corretto. Per le funzioni da implementare in questo progetto probabilmente non ti serve nè ti porta alcun vantaggio, però se progetti pensando a futuri sviluppi non si può tralasciare questo aspetto.
Dato che non è richiesto dalle specifiche, puoi tranquillamente non farlo, così eviti di incasinarti troppo se non hai troppa padronanza con la materia.
Nel caso lo facessi ovviamente in fase di inserimento devi inserire nelle due tabelle, associando ad annuncio la chiave dell'immobile inserito.
Se l'immobile è già presente invece devi solamente inserire in annuncio.
Con una semplice join arrivi allo stesso punto di avere un'unica tabella, quindi per le funzioni di ricerca ti cambia relativamente.
Tra l'altro leggo che richiede viste materializzate, quindi a maggior ragione cambia nulla.
Mi dite cosa intende per clustering? Oltre che concettualmente, proprio tecnicamente vorrei sapere come andrebbero implementati questi raggruppamenti.
Perché se è quello che intendo io, va fatto con tecniche di partizionamento che mi sembra tutt'altro che semplice.
Per quanto riguarda la tua soluzione per me è 'scorretta' per due motivi:
1) come vedi avrebbe più senso legarla ad immobile e non ad annuncio (è l'appartamento ad avere la portineria, non l'annuncio: lo stesso appartamento avrà la portineria in tutti gli annunci che gli associ)
2) non c'è motivo di dividere in due tabelle quegli attributi che saranno sempre da esplicare per ogni annuncio, dato che non splitti in base alla categoria di immobile.
Guarda qualche post sopra che se ne è discusso. Direi che ad occhio quelle son le uniche due opzioni valutabili. |
SanJuanWolf89 |
Raggruppamento per similarita. Gli annunci possono essere raggruppati in cluster sulla
base di criteri di similarita. Un cluster e un gruppo di annunci che risultano simili rispetto
a un dato criterio. Ad esempio, utilizzando la vicinanza geograca come criterio di simila-
rita, si otterranno cluster che raggruppano annunci di immobili collocati in aree vicine. Il
1Lo studente decide a priori e documenta le tipologie disponibili.
2
criterio di similarita puo essere dotato di parametri che ne in
uenzano il comportamento2.
Un esempio di parametro e la tolleranza che stabilisce la soglia entro la quale considerare
simili due annunci. Ad esempio, utilizzando la vicinanza geograca come criterio, la tolle-
ranza puo essere di 10km per fare in modo che gli annunci di immobili nel raggio di 10km
vengano raggruppati nel medesimo cluster. Il sistema deve supportare ALMENO 2 criteri
di similarita dierenti. Il criterio per vicinanza geograca deve essere obbligatoriamente
supportato dalla base di dati. Gli utenti registrati e non registrati possono visualizzare gli
annunci raggruppati in cluster secondo un criterio di similarita predenito scelto dall'am-
ministratore dell'applicazione. L'amministratore puo cambiare la visualizzazione in cluster
selezionando un diverso criterio di similarita tra quelli supportati dall'applicazione. Nella
realizzazione del progetto, si consideri che l'inserimento, la modica e la cancellazione di
annunci richiede l'aggiornamento dei cluster.
io l'ho implementato cn le viste materializzate con opportuni trigger :) |
number15 |
Si, avevo capito a cosa servissero, ma non mi era ben chiaro come volesse che fosse realizzato il tutto.
Spero vivamente che dobbiate farlo con le viste materializzate, ma il dubbio mi era sorto perché sopra parla chiaramente di viste materializzate
E’ pertanto necessario realizzare gli opportuni trigger che mantengano aggiornate tali viste in relazione all’inserimento
o alla modifica di annunci.
mentre qua altrettanto chiaramente parla di cluster
Nella realizzazione del progetto, si consideri che l'inserimento, la modica e la cancellazione di annunci richiede l'aggiornamento dei cluster. |
SanJuanWolf89 |
Gia ma dato k alle lezioni ci siamo concentrati soprattutto sullòe viste m. e dato che il partizionamento in laboratoriomanco l abbiamo fatto io l'hoimplementato cosi :) e x questo per nn rendere troppo complesso il tutto ho usato una sola tabella annuncio..cmq è un ottima soluzione anke la tua |
number15 |
Come ti ho detto credo e spero che voglia viste materializzate :D
Usare solo la tabella annuncio rispetta le specifiche quindi è senz'altro corretto.
Quando diedi io l'esame era espressamente richiesto che fosse tutto in terza forma normale.
Ora nel testo non lo vedo scritto, ma dateci un occhio comunque che potrebbero chiedervelo in fase di discussione del progetto. |
SanJuanWolf89 |
sISI poi cmq il prof ha dtt k c possono essere diverse soluzioni quindi io l ho implementato cosi..inoltre a me ha dtt espressamente che vogliono vedere cm facciamo i trigger quindi penso si concentrino su quello sopratutto:) |
number15 |
Se ti vengono i trigger sei già a buon punto, dato che spesso è la cosa più ostica da gestire, o meglio, si sbaglia sempre qualcosa nella sintassi agli inizi. |
spikey |
Ragazzi ma per quanto riguarda il raggruppamento di similarità della vicinanza geografica, io ho trovato questa formula:
Siano x1, y1, x2, y2 la latitudine (x) e la longitudine (y) rispettivamente dei punti A e B; sia DELTA1 la differenza tra le due longitudini e DELTA2 la distanza angolare tra i due punti considerati (A,B).
La distanza angolare tra A e B è data dalla formula:
DELTA1 = y1 - y2
DELTA2 = arccos(sin(x1)*sin(x2) + cos(x1)*cos(x2)*cos(DELTA1))
Sia R il raggio della terra arrotondato e D la distanza in Km tra A e B.
La distanza in Km tra A e B è data dalla formula:
R = 6360
D = DELTA2*R
Qualcuno ha fatto così?
Inoltre usando questa formula, dovrei basarmi su una coppia di coordinate "prestabilite" per verificare la vicinanza con tutte le altre coppie. Quale coppia di coordinate "prestabilite" scegliere?
Fatemi sapere, grazie! |
Shaper |
Originally posted by spikey
Inoltre usando questa formula, dovrei basarmi su una coppia di coordinate "prestabilite" per verificare la vicinanza con tutte le altre coppie. Quale coppia di coordinate "prestabilite" scegliere?
Fatemi sapere, grazie!
Io pensavo di implementare in PHP questo algoritmo qua: Dbscan
A prima vista non mi sembra complicato e fa tutto quello che serve e gli unici parametri che gli devi dare sono la soglia e il numero minimo di elementi in un cluster (che può tranquillamente essere 1), quindi non hai nessun problema di scelta delle coordinate "prestabilite"
Ovviamente se qualcuno ha già trovato in rete un'implementazione già fatta ben venga! :P |
number15 |
@Spikey
Io in altri progetti utilizzo questa formula:
SELECT ROUND(((ACOS(SIN($lat * PI() / 180) * SIN(t.lat * PI() / 180) + COS($lat * PI() / 180) * COS(t.lat * PI() / 180) *
COS(($lon - t.lon) * PI() / 180)) * 180 / PI()) * 60 * 1.1515 $unit), 2) AS distance
FROM table t
$unit = '*1.609344' per i km
$lat e $lon sono le coordinate dell'oggetto che si prende come riferimento.
Questo però non fa quello richiesto dal progetto, perché i raggruppamenti vanno fatti a monte e soprattutto non rispetto ad un punto sulla mappa, ma rispetto ai vari punti sulla mappa.
@Shaper
Credo possa essere una buona soluzione: l'unico dubbio è che solitamente non sono richieste particolari algoritmi a livello di programmazione, e in questo caso non mi pare proprio semplicissimo.
Onestamente non saprei proprio aiutarvi su sta cosa.
Tra l'altro è una funzione di cui non capisco l'utilità.
Boh boh, mi vien da pensare però che ci voglia per forza un punto di riferimento. |
pintu |
Scusate una cosa che non centra niente..qualcuno sa se per lo scritto di basi c'è il salto appello? |
Shaper |
Originally posted by pintu
Scusate una cosa che non centra niente..qualcuno sa se per lo scritto di basi c'è il salto appello?
Per quello di settembre c'era, presumo anche per questo.. :( |
basettoni |
Ciao a tutti.
Anche io sono in procinto di consegnare il progetto ma ancora non ho trovato un modo logico di risolvere la questione della divisione in cluster... Ho pensato di "farla sporca" e implementare una funzione che ritorni, usando la funzione distanza, tutti gli annunci entro un raggio di N Km da un dato annuncio. Funzione che poi andrei ad usare nella visualizzazione del singolo annuncio dove visualizzerei tutti gli annunci che distano al massimo N Km dall'annuncio visualizzato.
Questa cosa però non mi convince perchè sembra dal testo che la divisione in cluster vada fatta quando si inserisce un nuovo annuncio e tutto vada salvato nel db. Ma come si può suddividere gli annunci in distanza senza avere un punto da cui calcolare le distanze?
Quanlcuno di voi ha avuto qualche idea in merito? |
Shaper |
Originally posted by basettoni
Ciao a tutti.
Anche io sono in procinto di consegnare il progetto ma ancora non ho trovato un modo logico di risolvere la questione della divisione in cluster... Ho pensato di "farla sporca" e implementare una funzione che ritorni, usando la funzione distanza, tutti gli annunci entro un raggio di N Km da un dato annuncio. Funzione che poi andrei ad usare nella visualizzazione del singolo annuncio dove visualizzerei tutti gli annunci che distano al massimo N Km dall'annuncio visualizzato.
Questa cosa però non mi convince perchè sembra dal testo che la divisione in cluster vada fatta quando si inserisce un nuovo annuncio e tutto vada salvato nel db. Ma come si può suddividere gli annunci in distanza senza avere un punto da cui calcolare le distanze?
Quanlcuno di voi ha avuto qualche idea in merito?
Come ho detto qualche post fa, l'algoritmo Dbscan fa proprio questo: divide un insieme di punti in cluster, senza la necessità di fornirgli nessun parametro a parte il numero minimo di punti che deve avere un cluster per essere considerato tale e la soglia.
Io lo sto implementando e credo di avere quasi finito: è un po' una rottura, ma è fattibile, con un po' di manipolazione di array.
Più che altro, ma poi il risultato dev'essere memorizzato nel database? Se faccio in modo che venga eseguito l'algoritmo ogni volta che si vogliono visualizzare i cluster non va bene lo stesso? Ok, come efficienza non sarà il massimo, ma non stiamo parlando di algoritmi poi così eterni.. |
basettoni |
Originally posted by Shaper
Come ho detto qualche post fa, l'algoritmo Dbscan fa proprio questo: divide un insieme di punti in cluster, senza la necessità di fornirgli nessun parametro a parte il numero minimo di punti che deve avere un cluster per essere considerato tale e la soglia.
Io lo sto implementando e credo di avere quasi finito: è un po' una rottura, ma è fattibile, con un po' di manipolazione di array.
Più che altro, ma poi il risultato dev'essere memorizzato nel database? Se faccio in modo che venga eseguito l'algoritmo ogni volta che si vogliono visualizzare i cluster non va bene lo stesso? Ok, come efficienza non sarà il massimo, ma non stiamo parlando di algoritmi poi così eterni..
A pagina 3 dice:
"... si consideri consideri che l'inserimento, la modifica e la cancellazione di annunci richiede l'aggiornamento dei cluster."
Comunque se ho capito bene questo algoritmo in sostanza aggiunge un punto a un dato cluster se la distanza tra lui e un punto del cluster è minore di una data soglia imposta giusto? |
number15 |
Se si parla di cluster nel vero senso, si, la divisione va memorizzata.
Cerca tecniche di partitioning in mysql su Google e ci dovrebbero essere alcuni esempi di cluster: in pratica diciamo che divide una tabella in n tabelle sulla base di un campo. Ad esempio dividi per anno di nascita gli utenti e in inserimento la persona finirà nella tabella del suo anno.
Per me la richiesta è complicatissima, costosissima e senza senso.
Io penserei o ad una divisione a zone o alla distanza dal punto prescelto, conscio del fatto che non sia quello richiesto nelle specifiche.
Avete provato a sentire la prof.? |
Shaper |
Originally posted by basettoni
A pagina 3 dice:
"... si consideri consideri che l'inserimento, la modifica e la cancellazione di annunci richiede l'aggiornamento dei cluster."
Sì, ma il concetto è che la clusterizzazione dev'essere dinamica e rispecchiare i cambiamenti del DB (cioè non lo faccio una volta all'inizio e poi basta), non dice esplicitamente che bisogna SCRIVERE fisicamente i cluster nel DB...
Come al solito la specifica lascia tantissimo all'interpretazione |
number15 |
Per questo motivo sostengo quanto scritto sopra, perché essendo un cluster basato su confronti ad ogni inserimento dovresti ricreare le tabelle, perché la posizione di un nuovo immobile ti cambia tutte le distanze. Inoltre vuole la possibilità di cambiare il numero della distanza. |
Shaper |
Originally posted by number15
Per questo motivo sostengo quanto scritto sopra, perché essendo un cluster basato su confronti ad ogni inserimento dovresti ricreare le tabelle, perché la posizione di un nuovo immobile ti cambia tutte le distanze. Inoltre vuole la possibilità di cambiare il numero della distanza.
Sì, ma se io mi faccio una funzione clusterizza() e la invoco, a partire dallo stato attuale del DB, ogni volta che ho bisogno dei cluster (sia utenti normali sia amministratori), per l'utente il risultato è identico. |
Shaper |
In ogni caso concordo sul fatto che, messa così come nelle specifiche, è una funzione costosa, complessa e completamente inutile! |
basettoni |
E poi per quanto ho capito, chiede di creare cluster di "dimensione di 10km" mentre tutti gli algoritmi di clustering che ho visto parlano di "soglie tra punto e punto". |
number15 |
Originally posted by Shaper
Sì, ma se io mi faccio una funzione clusterizza() e la invoco, a partire dallo stato attuale del DB, ogni volta che ho bisogno dei cluster (sia utenti normali sia amministratori), per l'utente il risultato è identico.
Sì, ho capito, ma non è un cluster :-D
Il cluster è la livello di db, non di applicazione.
Per questo ti avevo detto che poteva essere un metodo corretto quell'algoritmo, ma mi sembrava troppo complesso per un esame di database. |
Shaper |
Originally posted by number15
Sì, ho capito, ma non è un cluster :-D
Il cluster è la livello di db, non di applicazione.
Per questo ti avevo detto che poteva essere un metodo corretto quell'algoritmo, il ma mi sembrava troppo complesso per un esame di database.
Ah ho capito cosa intendevi: realizzare una clusterizzazione che possa essere fatta solo a livello di database con dei trigger, giusto?
Ha senso sicuramente (anche e soprattutto per un esame di database), ma in questo modo non è possibile realizzare quello che chiede la specifica (oddio, tutto è possibile, ma non ho la minima intenzione di mettermi a implementare quell'algoritmo in SQL!!! :shock: ) |
number15 |
Si, cioè il clustering è proprio quello. Serve quando hai tabelle enormi per velocizzare le query. Dividi la tabella in più tabelle sulla base di un campo e tutti le query andranno fatte sulle corrispondenti tabelle, quindi quando fai una select dall'applicazione devi eseguirla sulla tabella corretta.
Detto ciò, in questo caso non è fattibile perché il tuo partizionamento non è fisso, ma varia ad ogni inserimento dato che le distanze sono calcolate tra immobili e non rispetto ad un punto stabilito.
Edit: questo Link spiega bene come funziona il partizionamento : http://www.stardata.it/le-novita-di-mysql-5-1-186/ |
Shaper |
Originally posted by number15
Si, cioè il clustering è proprio quello. Serve quando hai tabelle enormi per velocizzare le query. Dividi la tabella in più tabelle sulla base di un campo e tutti le query andranno fatte sulle corrispondenti tabelle, quindi quando fai una select dall'applicazione devi eseguirla sulla tabella corretta.
Detto ciò, in questo caso non è fattibile perché il tuo partizionamento non è fisso, ma varia ad ogni inserimento dato che le distanze sono calcolate tra immobili e non rispetto ad un punto stabilito.
Edit: questo Link spiega bene come funziona il partizionamento : http://www.stardata.it/le-novita-di-mysql-5-1-186/
Grazie del link, non avevo nemmeno preso in considerazione questa opzione. Ormai temo sia tardi per rifare tutto (devo ancora fare la ricerca), quindi per quanto mi riguarda lo terrò così com'è e spiegherò le ragioni nella documentazione, speriamo bene!
Che voi sappiate, sono molto fiscali nella correzione o accettano scelte un po' alternative, se ben documentate? |
SanJuanWolf89 |
Scusate ma sulla consegna parla chiaro "annunci di immobili nel RAGGIO di 10 km" quindi ne deduco che per forza bisogna considerare un punto centrale. Quindi il parametro che influenza il fatto che un annuncio sia raggruppato o meno è proprio la distanza da questo punto centrale non la distanza tra un annuncio e l'altro. Questo proprio perchè sul testo parla di raggio |
SanJuanWolf89 |
Originally posted by Shaper
Che voi sappiate, sono molto fiscali nella correzione o accettano scelte un po' alternative, se ben documentate?
Dei miei amici l 'hanno sostenuto l anno scorso e hanno detto di non sbattersi piu di tanto..sta di fatto che è cmq meglio fare le cose ben fatte per evitare inconvenienti..cmq la cosa che piu guardano da quello che ho capito è il diagramma ER |
miccio.87 |
ciao a tutti
ma per quanto riguarda le viste materializzate come le avete svolte? |
thirdmoon030 |
Io avrei un po di domande a carattere generale sul progetto anche perchè è da un po che l'ho iniziato ma non riesco a venire a capo di alcune cose.
Inizierei dalle tabelle:
bisogna mettere + tabelle possibile o generalizzare al massimo?
una tabella x utenti, annunci e immobili bastano?
(dove l'id dell'utente è chiave esterna dell'annuncio e l'id dell'annuncio è chiave esterna dell'immobile)
poi i raggruppamenti che nel link qui sopra vengono spiegati x MySQL sono da fare nello stesso modo x PostgreSQL? (è meglio usare MySQL rispetto a PostgreSQL?)
i raggruppamenti alla fine non sono viste? se no qual'è la differenza? |
marco91 |
Ciao a tutti! Mi aggiungo anche io...
Per la vicinanza geografica credo ci si debba basare su un punto, perchè se io ho come raggruppamento gli immobili che sono a 10km l'uno dall'altro (con il metodo suggerito da number15), avendo una sufficiente densità di immobili avrei che tutti gli immobili sono nello stesso cluster! Ad esempio se il sito si occupa di vendere case in lombardia, avendo una casa a milano, una a sesto, una a monza, una a lissone ecc... avrei che tutti questi annunci sono nello stesso cluster perchè messi in quest'ordine sarebbero ognuno entro 10km all'altro. A lato pratico questa funzione sarebbe inutile, se io sto cercando una casa a milano non mi va bene una a lissone, o sbaglio?
Il problema rimane scegliere il punto di riferimento... il primo annuncio del database? il centro dell'italia? Oppure devo lasciar scegliere all'utente l'origine (magari con un pulsante specifico "cerca nei dintorni" vicino all'annuncio nella pagina web) e poi ricaricare la pagina con l'annuncio scelto in cima e poi tutti gli altri in cascata. Ma questo sarebbe una funzione a livello di php che non influenza minimamente il database. (E aggiungo che mi sembra la soluzione più sensata).
Per gli altri parametri sarebbe più semplice. Ad esempio per la suddivisione in base al contratto io fare una vista che replica la tabella immobile (io ho semparato annuncio e immobile) ma con un ordinamento a livello del campo "contratto" (GROUP BY) Nella visualizzazione scorrerei la tabella e ogni volta che cambia il valore di "contratto" (ma può essere anche un qualsiasi altro parametro, tipo la categoria) stampo una linea nella pagina a segno che cambia il tipo di paramentro. |
number15 |
Ciao marco,
il problema è sempre lo stesso: non si capisce la richiesta! :D
Come hai giustamente spiegato il primo metodo non ha senso o meglio non ha nessuna utilità nella pratica oltre ad essere di complicatissima realizzazione per me (mi pare che Shaper avesse linkato l'algoritmo da implementare).
Anche scegliere un punto di riferimento fisso non ha molto senso. Se sono a Milano sicuramente non mi interessa cercare gli immobili a 10km da Roma e idem per il viceversa.
L'unico che ha senso è appunto il 'cerca nei dintorni', ma non è una tecnica di cluster.
Io rinnovo il consiglio di chiedere ai prof o di sperare che qualcuno che abbia già discusso il progetto dia delucidazioni su questo punto.
Non mi è chiaro invece cosa vuoi fare per gli immobili.
Anche qua comunque la richiesta è un po' 'fumosa': cosa te ne fai di più viste materializzate!?
Io al max ne creerei una e studierei quali campi indicizzare. |
number15 |
Originally posted by thirdmoon030
Io avrei un po di domande a carattere generale sul progetto anche perchè è da un po che l'ho iniziato ma non riesco a venire a capo di alcune cose.
Inizierei dalle tabelle:
bisogna mettere + tabelle possibile o generalizzare al massimo?
una tabella x utenti, annunci e immobili bastano?
(dove l'id dell'utente è chiave esterna dell'annuncio e l'id dell'annuncio è chiave esterna dell'immobile)
poi i raggruppamenti che nel link qui sopra vengono spiegati x MySQL sono da fare nello stesso modo x PostgreSQL? (è meglio usare MySQL rispetto a PostgreSQL?)
i raggruppamenti alla fine non sono viste? se no qual'è la differenza?
Devi rispettare il più possibile la 3NF per cui 3 tabelle in tutto sicuramente non bastano :D
Per PostgreSQL non so aiutarti, non l'ho mai utilizzato.
Ora non so a che link ti riferisci, se è quello per la spiegazione dei cluster lascialo perdere per ora che è piuttosto complesso e dubito sia richiesto ai fini del progetto. |
thirdmoon030 |
quante dovrebbero essere le tabelle?
bisogna dividere le tipologie di annunci es affitto e vendita? o le categorie di immobili? es monolocale, bilocale ecc... oppure no? |
number15 |
Il numero di tabelle non so dirtelo, in quanto non ho fatto, ne sto facendo, il progetto.
Prova a guardare nelle pagine indietro che qualcosa si è discusso.
Così su due piedi non so dirti cosa devi dividere.
Prova a fare ed eventualmente postare lo schema ER e poi decidi come implementare il tutto. |
marco91 |
Originally posted by number15
Ciao marco,
il problema è sempre lo stesso: non si capisce la richiesta! :D
Come hai giustamente spiegato il primo metodo non ha senso o meglio non ha nessuna utilità nella pratica oltre ad essere di complicatissima realizzazione per me (mi pare che Shaper avesse linkato l'algoritmo da implementare).
Anche scegliere un punto di riferimento fisso non ha molto senso. Se sono a Milano sicuramente non mi interessa cercare gli immobili a 10km da Roma e idem per il viceversa.
L'unico che ha senso è appunto il 'cerca nei dintorni', ma non è una tecnica di cluster.
Io rinnovo il consiglio di chiedere ai prof o di sperare che qualcuno che abbia già discusso il progetto dia delucidazioni su questo punto.
Non mi è chiaro invece cosa vuoi fare per gli immobili.
Anche qua comunque la richiesta è un po' 'fumosa': cosa te ne fai di più viste materializzate!?
Io al max ne creerei una e studierei quali campi indicizzare.
Io ho suddiviso le tabelle così: annuncio (con ID, titolo data utente ecc.... e riferimento a immobile, riferimento a files e a utenti), immobile (con ID e tutte le caratteristiche della casa e riferimento a categorie), categorie(ID, nome e descrizione), utenti (nome, tipo email ecc....), files(ID e BLOB x la foto)
Faccio un esempio, devo implementare la visualizzazione cluster con criterio di similarità "contratto". Quindi creo una vista di questo tipo:
CREATE VIEW similarita_contratto AS
SELECT (campi utili)
FROM annuncio NATURAL JOIN immobili NATURAL JOIN categorie NATURAL JOIN utenti
GROUP BY contratto
In questo modo, quando viene scelto il cluster "per contratto" e fatta una ricerca, prelevo le righe che mi servono e che sono già in ordine di modo che nella visualizzazione compaiano prima gli affitti e poi le vendite. Creando una divisione (grafica) tra un tipo e l'altro di contratto.
Oppure nella similarità per prezzo:
CREATE VIEW similarita_prezzo AS
SELECT (campi utili)
FROM annuncio NATURAL JOIN immobili NATURAL JOIN categorie NATURAL JOIN utenti
GROUP BY Prezzo ASC
Così prelevando le righe risultanti dalla ricerca dell'utente sono già in ordine di prezzo crescente.
Io la clusterizzazione l'ho intesa così. Quella per per vicinanza geografica non può proprio essere implementata a livello di database in quanto per ogni immobile non c'è come per i prezzi uno più piccolo e uno più grande ma ci sono infinite direzioni su cui concentrarsi per definire chi c'è prima e chi c'è dopo e soprattutto serve un riferimento che non può essere deciso a priori. Per cui sia usando viste, tabelle o qualsiasi altro metodo non si riesce comunque ad ottenere la clusterizzazione, a meno di creare una vista per ogni latitudine/longitudine di ogni immobile inserito: soluzione assurda.
Per cui io la faccio a livello di php, faccio una funzione "cerca nei dintorni" e via... perchè è la soluzione più logica e sesata.
Soprattutto mi fa paura leggere "i cluster devono essere aggiornabili" ma sia utilizzando le viste, sia utilizzando il php non dovrei aggiornare un bel niente dei cluster... =S
Altra domanda:
quanto deve essere lungo il manuale tecnico e quello utente? Ne ho visto qui uno sul dsy da 60 pag... |
number15 |
Ad occhio direi che ti manca una tabella città, il cui id diventa fk in immobile.
Per la tabella files non utilizzerei un campo blob, ma un normale varchar (guarda il topic sotto a questo).
Poi mancano le tabelle che si creano dalle relazioni n a n, tipo tra immobile e files o tra annuncio e files (in base a cosa vuoi associarle).
Comunque andrebbe visto lo schema ER ed il relazionale completo.
GROUP BY non fa quello che vuoi. Non è che ti stai confondendo con ORDER BY?
Per i cluster ti ripeto non so cosa voglia. Dubito però intenda una semplice vista. Una vista è semplicemente una query. Quando operi sulla vista, semplcimente viene prima eseguita la query della vista e poi eseguita la query sulla vista.
Quindi una query del tipo
code: SELECT (campi utili)
FROM (tabelle join)
ORDER BY contratto
è identica
code:
SELECT *
FROM vista
dove vista è quella sopra.
Non cambia niente.
Come minimo vorrà delle viste materializzate.
Concordo che non abbia senso per le distanze.
Io metterei dei campi lat e lon in immobile e poi mostrerei gli immobili che distano xkm dal punto selezionato (ho postato una funzione che utilizzo per trasformare in km le distanze tra coordinate).
Conscio del fatto che lei parla di tutt'altro però. |
marco91 |
Originally posted by number15
Ad occhio direi che ti manca una tabella città, il cui id diventa fk in immobile.
Per la tabella files non utilizzerei un campo blob, ma un normale varchar (guarda il topic sotto a questo).
Poi mancano le tabelle che si creano dalle relazioni n a n, tipo tra immobile e files o tra annuncio e files (in base a cosa vuoi associarle).
Comunque andrebbe visto lo schema ER ed il relazionale completo.
GROUP BY non fa quello che vuoi. Non è che ti stai confondendo con ORDER BY?
Per i cluster ti ripeto non so cosa voglia. Dubito però intenda una semplice vista. Una vista è semplicemente una query. Quando operi sulla vista, semplcimente viene prima eseguita la query della vista e poi eseguita la query sulla vista.
Quindi una query del tipo
code: SELECT (campi utili)
FROM (tabelle join)
ORDER BY contratto
è identica
code:
SELECT *
FROM vista
dove vista è quella sopra.
Non cambia niente.
Come minimo vorrà delle viste materializzate.
Concordo che non abbia senso per le distanze.
Io metterei dei campi lat e lon in immobile e poi mostrerei gli immobili che distano xkm dal punto selezionato (ho postato una funzione che utilizzo per trasformare in km le distanze tra coordinate).
Conscio del fatto che lei parla di tutt'altro però.
Per le distanze farò come hai detto anche tu, per la città io ho fatto semplicemente nella tabella immobile un campo città, uno latitudine e uno longitudine. All'inizio avevpo creato una tabella città ma mi sembrava inutile per solo due campi in più.
Ma se uso varchar metterei l'url dell'immagine giusto? Io uso BLOB, anzi il LONGBLOB, giusto per usare un po' il database :D Ho già preparato la procedura di upload, funziona bene per cui penso terrò questa :)
GROUP BY "campo" ASC/DESC fa la funzione di GROUP BY assieme a quella di ORDER BY riferito a quel campo. :)
Mi sono accorto che non ho usato nessun trigger, ma sono indispensabili? Perchè a me funziona tutto ugualmente. Anche le stored procedure non le ho usate... |
number15 |
Originally posted by marco91
Per le distanze farò come hai detto anche tu, per la città io ho fatto semplicemente nella tabella immobile un campo città, uno latitudine e uno longitudine. All'inizio avevpo creato una tabella città ma mi sembrava inutile per solo due campi in più.
Magari però di città ti servono altre informazioni, tipo se fa o meno provincia, in che provincia sta, regione, nazione ecc.
Originally posted by marco91
Ma se uso varchar metterei l'url dell'immagine giusto? Io uso BLOB, anzi il LONGBLOB, giusto per usare un po' il database :D Ho già preparato la procedura di upload, funziona bene per cui penso terrò questa :)
Si, dovresti semplicemente mettere il percorso dell'img (o parte del percorso) e poi salvare l'immagine in una cartella del sito.
Comunque usa pure il BLOB.
Originally posted by marco91
GROUP BY "campo" ASC/DESC fa la funzione di GROUP BY assieme a quella di ORDER BY riferito a quel campo. :)
In che linguaggio?
Di sicuro non MySQL, ma dubito pure in altri linguaggi.
In ogni caso la GROUP BY raggruppa, quindi se raggruppi per tipologia di contratto avrai come risultato 2 righe, una per affitto e una per vendita.
Originally posted by marco91
Mi sono accorto che non ho usato nessun trigger, ma sono indispensabili? Perchè a me funziona tutto ugualmente. Anche le stored procedure non le ho usate...
I trigger servono per modificare il contenuto delle tabelle a seguito di una qualche azione.
Puoi solitamente ottenere lo 'stesso risultato' usando delle query a livello applicativo, ma in un esame di database solitamente sono richiesti. |
marco91 |
Originally posted by number15
Magari però di città ti servono altre informazioni, tipo se fa o meno provincia, in che provincia sta, regione, nazione ecc.
Si, dovresti semplicemente mettere il percorso dell'img (o parte del percorso) e poi salvare l'immagine in una cartella del sito.
Comunque usa pure il BLOB.
In che linguaggio?
Di sicuro non MySQL, ma dubito pure in altri linguaggi.
In ogni caso la GROUP BY raggruppa, quindi se raggruppi per tipologia di contratto avrai come risultato 2 righe, una per affitto e una per vendita.
I trigger servono per modificare il contenuto delle tabelle a seguito di una qualche azione.
Puoi solitamente ottenere lo 'stesso risultato' usando delle query a livello applicativo, ma in un esame di database solitamente sono richiesti.
Bo a me il GROUP BY riordina anche :)
I trigger ho già trovato dove inserirli, mi ero dimenticato delle viste materializzate (che su MySQL non sono supportate) per cui devo gestirle manualmente! :( |
number15 |
Riordina per il campo del group by, ma il 'problema' è che raggruppa.
Se tu hai questa tabella
ANNUNCIO(id_annuncio, contratto, id_utente, ecc)
con queste tuple:
1, vendita, 4
2, affitto, 2
3, vendita, 5
4, affitto, 10
5, affitto, 15
6, vendita, 8
La query SELECT * FROM annuncio GROUP BY contratto
restituirà
2, affitto, 2
1, vendita, 4
e non quello che vuoi far tu.
Per le viste materializzate dai un occhio qua: http://blog.fl3x.de/2005/10/26/mate...views-in-mysql/ |
|
|
|
|