Visualizzazione dei risultati da 1 a 7 su 7

Discussione: Domanda su Mysql e db

  1. #1

    Domanda su Mysql e db

    Salve a tutti scusatemi se vado off t.

    Allora vi espongo il mio probbelma quesito.

    Sto facendo un sito con tecnologia asp e db mysql.
    Su questo sito c'è una parte di registrazione che fa riferimento al singolo individuo ed ogni singolo individuo ha la possibilità di inserire moli molto grandi di dati in una tabella che poi dovrebbe essere comune a tutti (logicamente ogni dato avrebbe come riferimento l'id dell'utente che lo ha inserito).
    Visto la grossa mole di dati ho pensato di associare ad ogni utente le due tabelle (che sarebbero le due tabelle di partenza) e quindi di far fare gli inserimenti dei suoi dati in tabelle che sono univoche e legate al singolo utente.
    Questo perchè in questo modo al posto di avere ad esempio una tabella con 1.000.000 di user i quali fanno capo a 50 iscritti al sito ho una tabella con i 50 iscritti e le relative 2 tabelle per ogni iscritto. Quindi le ricerche e tutte le query sulle tabelle dovrebbero essere semplificate.
    In questo modo la mole di dati non è enorme come in principio.

    Adesso ho un dubbio. E' vero che il db contiene la stessa mole di dati ma su più tabelle, questo mi aiuta veramente affinche il sito sia veloce o metto tutto in una tabella e via?

    Questo discorso è stato fatto anche perchè chi mi ha fatto fare il sito non vuole spendere soldi di hosting "pregiati" o di server dedicati quindi ho pensato di ottimizzare in questo modo.
    e' la strada giusta?

    Vi ringrazio per la pazienza e spero di esser stata chiara nell'esposizione del problema.

  2. #2
    Utente di HTML.it L'avatar di wallrider
    Registrato dal
    Apr 2003
    Messaggi
    2,755
    secondo me, se organizzi bene gli indici, è meglio il tabellone
    RIP Cicciobenzina 9/11/2010

    "Riseminaciceli, i ceci nell'orto"

  3. #3
    Grazie per la risposta. Beh non so ma credo che ci sia poco da organizzare. Ogni iscritto che ha diritto all'inserimento di dati ha un proprio id. Quindi all'interno della tabella metterò un campo id come chiave non primaria e quando vado a ricercare i dati inseriti da un utente baso la ricerca su questo campo. Sbaglio a pensare in questo modo?

    quindi la mia prima ipotesi di creare più tabelle non è vantaggiosa?
    qualcuno saprebbe spiegarmi meglio il perchè?

    Grazie Francy

  4. #4
    Io non ho capito di quali "due tabelle" parli. Mi pare tu ne abbia menzionata una sola.
    Se puoi specificare meglio.

    E non ho capito bene cosa vuoi 'spezzare/distribuire' tra più tabelle.

    Io farei semplicemente

    TbUtenti
    ----------------------------------
    idUtente | int (Primary Key)
    Nome | varchar(50)
    ....
    ... altri attributi degli utenti
    ....


    TbInserimenti
    ----------------------------------
    idInserimento | int (Primary Key)
    idUtente | int
    TestoInserito | varchar(4000)
    Visibile | bit
    ....
    ... altri attributi degli inserimenti
    ...


    Non vedo modo migliore di organizzarlo. Quando il database è normalizzato (argomento FONDAMENTALE da conoscere per progettare db) non c'è più molto da fare. Documentati sulla normalizzazione e già capirai più o meno cosa fare.

    Per il resto si tratta solamente di scrivere bene le query, selezionando sempre e solo i dati necessari.
    Per esempio piuttosto di:
    codice:
    SELECT *
    FROM TbInserimenti
    WHERE idUtente = <idUtenteRicercato>
    è meglio:
    codice:
    SELECT idInserimento, TestoInserito 
    FROM TbInserimenti
    WHERE idUtente = <idUtenteRicercato>
    AND Visibile = 1
    Eviti di andare a creare recordset con dati superflui (e quindi più pesanti da gestire/navigater).
    Inoltre usa il più possibile INNER/LEFT/RIGHT JOIN piuttosto che definire le relazioni nella WHERE.
    Non so se lo fai ma spesso alcuni (io stesso fino a qualche anno fa) fanno:
    codice:
    SELECT idElemento, Valore
    FROM TbElementi, TbLista
    WHERE TbElementi.idElemento = TbLista.idElemento
    Molto meglio
    codice:
    SELECT idElemento, Valore
    FROM TbElementi
    INNER JOIN TbLista ON TbElementi.idElemento = TbLista.idElemento
    Qua non cambia molto ma a seconda della query fa una differenza enorme!

    Apparte tutto questo ..... beh posso riprendere il suggerimento sopra di provare ad utilizzare bene gli indici.

    E se non sei soddisfatto e non riesci a migliorare ulteriormente ti suggerisco di fare in modo di mostrare durante il caricamento dei dati un'immagine che avverte l'utente di attendere il caricamento dei dati (che puoi poi rimuovere tramite Javascript, una volta caricato tutto).

    Facci sapere.

  5. #5
    Potresti specificare cosa intendi per "tanti dati"? (intendo una stima approssimativa del numero di record per tabella)
    Inoltre con quale versione di mysql lavori?

    Per principio l'idea di creare una tabella per ogni utente non si può sentire, esiste il partizionamento apposta.

    xxx

  6. #6
    Non avevo capito.
    Una tabella per ogni utente? VVoVe:
    Assolutamente improponibile. E credo che non serva poi a molto in fatto di ottimizzazione.

    Normalizza più che puoi e scrivi bene le query. Di solito basta e avanza (tantopiù su un rdbms veloce come MySql).

    Quello che ho scritto cos'ha che non va? Come vorresti fare invece?

  7. #7
    Scusate per il ritardo nelle risposte, ho analizzato la tua risposta ed anche secondo me potrebbe essere la strada giusta.
    Comunque cerco di spiegarmi meglio.
    La versione di mysql è la 5
    Ho un form di registrazione con una tabella che chiamo Login con:

    User
    pass
    ...
    ...
    ecc ecc.

    Poi ho altre 2 tabelle che sono

    Tabella persone con
    nome
    cognome
    ed altri dati relativi al singolo utente

    tabella date
    qui ci sono tutte le date relative al singolo utente.
    Costruisco questa tabella perchè le date associate ad un singolo utente possono essere molte (In questo caso credo di aver normalizzato il database creando questa tabella e non reinserendo di nuovo tutti i dati nella tabella precedente creando ridondanze).

    Quello che cercavo di dire io è che le tabelle persone e date possono avere una mole molto grossa di dati.

    Ogni utente registrato (nella tabella login) potrebbe inserire migliaia di utenti.
    Quindi mettiamo caso che ci siano 500 (Stima approssimata potrebbero essere molti di più!!!) utenti registrati nella prima tabella e che ognuno di questi inserisca 5000 utenti relativi a se stesso, il conto ci porta ad un totale di 2.500.000.

    Allora se ho a disposizione un server dedicato non ho nessun problema. Ma se non è così? credo che qualche problemino potrei averlo.

    Allora ho pensato di fare una cosa. Ad ogni utente registratosi dinamicamente faccio creare una tabella persone ed una date, e faccio lavorare l'utente su queste tabelle che al posto di avere una mole di dati pari a 2.500.000 ne avra 5000.

    Il mio dubbio però come cercavo di spiegare, funziona bene? è vero si sono molte tabelle da gestire ma con meno dati.
    E' un vantaggio questo?

    Scusate ancora e spero di non essere fuori tema col forum.
    Grazie per l'attenzione

    Francesca


    Alethesnake scusa cosa intendi per partizionamento?
    non ho capito

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.