- Home
- Categorie
- Coding e Sistemistica
- PHP
- Gestione avvisi tramite DB
-
Gestione avvisi tramite DB
Vi pongo un quesito.
Ho l'applicativo web che sto creando.
Solite cose con profilo personale, operazioni varie etc etc.Volevo implementare un sistema anche di gestione avvisi.
Vi spiego meglio:
Io, amministratore supremo scrivo X nuovi avvisi, gli memorizzo in una data tabella.
L'utente Pippo si logga e vede questi avvisi in primo piano. Di fianco ad ogni avviso c'è la possibilità di segnarlo come letto.Come faccio ad implementare un lavoro del genere senza creare mille e più tabelle, e senza inserire x*y (dove x è il numero di messaggi e y il numero di utenti) righe in una tabella??
-
Potresti creare una tabella di utenti, una di messaggi, all'interno della quale fai un riferimento incrociato con la prima.
Registri cioè l'id dell'utente nella tabella dei messaggi.Ogni utente che si collega fa una query sulla tabella generale dei messaggi, se ne esistono con id utente uguale al loro lo fai vedere. Se cliccano sul pulsante letto metti a true il flag "letto" della tabella messaggi e cosi via.
-
Il chè vorrebbe dire che io devo inserire un messaggio tante volte quanti sono gli utenti presenti nel DB..
Non è una soluzione un pò poco pratica?
Forse magari con una vista incrociata riuscire a farlo senza dover creare altre tabelle, oltre a quella dei messaggi in se...
[EDIT]
Cavolata, perchè nelle viste non posso aggiungere il campo booleano...
-
Allora forse io sto capendo un altra cosa.
Tu devi mandare lo stesso messaggio a tutti?
O messaggi privati a utenti diversi?
-
Lo stesso messaggio a tutti (o meglio, nello specifico, messaggi diversi a categorie diverse di utenti, però il concetto è lo stesso...)
-
Allora una cosa più elaborata ma concettualmente sempre lo stesso.
Definiamo alcune cose prima che elaboro meglio l'idea.
Un utente può appartenere a più categorie?
-
No, un utente appartiene ad una categoria specifica.
-
Bene infine lo stesso messaggio puo essere inviato a piu categorie?
-
Esatto..
-
Allora io suddividerei il problema nel modo seguente.
Una tabella utenti, e tra gli altri campi un campo idcategoria.
Questo serve per identificare attraverso questo id a quale categoria l'utente appartiene.Una tabella categorie con i soliti id, nome categoria e altri eventuali campi.
Una tabella messaggi all'interno della quale vanno salvati tutti i messaggi inviati.
Tra gli altri campi abbiamo i campi id categoria e id utente per risalire e sapere a che categoria appartiene il messaggio e l'id utente.Quando sei nella categoria "A", e clicchi su invia messaggio, lui deve controllare quanti utenti appartengono a quella categoria, e salvare quindi nella tabella messaggi tanti messaggi tanti quanti sono gli utenti delle medesima.
Infine occorre anche un campo "letto" da settare a true quando l'utente clicca sul pulsante letto del messaggio, a questo messaggio bastera passare l'id del messaggio ed il gioco è fatto.
Spero possa essere chiaro anche per te, e non solo per me che ho già l'idea in testa.
Saluti, Marco.
-
E' esattamente un pò la soluzione che avevo in mente io, è anche la soluzione più logica che può venire in mente.
Grazie per l'aiuto Marco!
-
Molto bene, l'unione fa la forza.
-
Un'altra strada forse percorribile potrebbe essere quella di creare un solo messaggio, associato ad un id categoria, e poi un campo che raccolga in questo formato gli id degli utenti:
-0-1-16-19-58-
-0- sarà il primo di defaultQuando l'utente con id 3, associato alla categoria id 5, si logga, fai eseguire la seguente query:
SELECT * FROm tabella WHERE id_categoria='5' AND id_utenti NOT LIKE "%-3-%"
Quando l'utente cliccherà sul tasto "letto" aggiornerai il campo degli id utenti che han letto aggiungendo 3- alla fine:
$id_utenti=$id_utenti."3-";
e quindi aggiorni la tabella.
In questa maniera crei un solo record per ogni messaggio.
-
Mmmh si, potrebbe essere un'altra soluzione...
Ora vedo quale potrebbe essere la migliore attuabile nel mio caso..
Grazie!!
-
Di nulla, è corretto anche lo sviluppo fatto con marcocarrieri, ma pensando al poi, immagina di avere 100 utenti e di mandare 100 avvisi l'anno.
In un solo anno creerai 10000 record per soli 100 avvisi categorizzati, risparmiare risorse significa anche risparmiare dindini e tempi di esecuzione.
Con questa soluzione, se applicabile ovviamente, avresti solo 100 record.
-
Forse l'unico "problema" sarebbe poi la lunghezza del record dove memorizzo gli utenti che hanno letto il massaggio..
-
Utilizzando un campo TEXT hai 2^16 caratteri disponibili, con LONGTEXT 2^32.
Un test che si potrebbe fare per vedere il risparmio di risorse è creare 1000 record (10 utenti * 100 avvisi) a simulare degli avvisi completi e poi creare 100 record che simulino i singoli avvisi e che nel campo id_utente contengano 10 id (-0-1-2-3-4-5-6-7-8-9-10-), e provare per ognuno dei due metodi quale occupa più spazio.
P.S. ovviamente non dico che sia fattibile, ma è un'idea che mi è venuta leggendo il thread.
-
No no ma ci credo che risparmio spazio
-
E' vero, questa soluzione mi piace di più, d'altronde all'università avevo preso solo 20 sull'esame di ottimizzazione ah ah ah.