Domanda

Questa è una domanda più teorica, non è uno scenario specifico:

Supponiamo, abbiamo uno schema semplificato tavolo in questo modo:

alt text

items contiene alcuni dati di base, item_data proprietà aggiuntive per ogni voce di un rel_items imposta un rapporto di albero tra i diversi elementi. Ci sono diversi tipi di elementi (rappresentati dal items.item_type campo) che hanno differenti campi memorizzati in item_data, ad esempio:. Cane, gatto, il mouse

Se abbiamo alcune query più grandi con un po 'si unisce e congiunzioni (roba come ottenere gli elementi con i loro elementi principali che hanno alcune condizioni con altri elementi e così via), potrebbe questo diventerà un problema di prestazioni rispetto a spaccare tutti i diversi tipi di elementi in separata tabelle (dog, cat, mouse) e non una loro fusione in un unico?

Se teniamo tutto in una tabella elemento di base, non la creazione di viste (cane, gatto, topo) impatto sulle prestazioni in qualche modo?

modifica (come ha commentato di seguito): ho pensato di "specie", "casa-pets", e così via come item_types. Ogni tipo ha proprietà diverse. L'intenzione di usare una tabella di elemento di base e la tabella item_data è di avere un "oggetto" base e fissaggio come molte proprietà a loro come necessario, senza dover modificare il regime database. Per esempio, non so quanti animali ci sarà per l'applicazione e quali proprietà che hanno, così ho pensato di uno schema di database che non ha bisogno di essere alterted ogni volta che l'utente crea un nuovo animale.

È stato utile?

Soluzione

  

Se abbiamo alcune query più grandi con un po 'join ..., questo potrebbe diventare un problema di prestazioni rispetto a spaccare tutti i diversi tipi di elementi in tabelle separate (cane, gatto, mouse) e non li si fondono in uno solo?

No.

  

Se teniamo tutto in una tabella elemento di base, non la creazione di viste (cane, gatto, topo) impatto sulle prestazioni in qualche modo?

No.

tavoli separati significa che sono cose fondamentalmente diverse - attributi diversi o diverse operazioni (o entrambi sono diversi)

Gli stessi mezzi di tabella sono fondamentalmente le stesse cose -. Stessi attributi e stesse operazioni

Le prestazioni non è la prima considerazione.

Il significato è la prima considerazione.

Dopo aver risolvere cosa significano queste cose, e quali sono le reali dipendenze funzionali tra gli elementi sono, allora si può considerare unire prestazioni.

"Cane, gatto, topo" sono tutti i mammiferi. Una tabella.

"Cane, gatto, topo" sono due carnivori e un onnivoro. Due tabelle.

"cane, gatto, topo" sono due tradizionali case-animali domestici e parassita convenzionali. Due tabelle.

"Cane, gatto, topo" sono una fresca animale e due animali cattivi. Due tabelle.

"cane, gatto, topo" sono tre specie separate. Tre tavole.

E 'sul significato.

Altri suggerimenti

Il tentativo di costruire uno schema che può accomodare i nuovi oggetti, non quelli analizzati e inclusi quando il database è stato progettato, è un'idea che si apre più e più volte nelle discussioni di database relazionali.

Nella modellazione di dati relazionali classici, i rapporti può essere messo a punto alla luce di alcune proposizioni che devono essere affermato circa l'universo di discussione. Queste proposizioni sono i fatti che gli utenti dei dati possono ottenere con il recupero dei dati dal database. le relazioni di base sono esercitati, anche per memorizzare qualcosa nel database. rapporti derivati ??possono essere ottenuti dalle operazioni sulle relazioni di base. Quando un database SQL è costruito utilizzando un modello di dati relazionale come una guida, le relazioni di base diventano tabelle e delle relazioni derivate diventano punti di vista.

Ma tutto ciò presuppone che gli attributi vengono scoperti durante l'analisi dei dati, prima di iniziare la progettazione di database.

In pratica, nel corso degli ultimi 25 anni, la maggior parte dei database sono state costruite sulla base di una successiva analisi ha rivelato di essere stato incompleto o non corretto. Basi di dati poi vengono rivisti alla luce di analisi nuova e migliorata, e il database rivisto a volte richiede il codice di applicazione di manutenzione. A dire il vero, il modello relazionale e database SQL creato un minor numero di dipendenze delle applicazioni rispetto ai database relazionali pre-fatto.

Ma è naturale cercare di venire con uno schema di dati generici come la vostra, che può ospitare qualsiasi materia oggetto di sorta, senza modifiche dello schema. Ci sono conseguenze per questo approccio, e coinvolgono gran lunga maggiori costi rispetto a meri problemi di prestazioni. Per i progetti di piccole dimensioni, questi costi sono abbastanza gestibile, e lo schema del tutto generico possono funzionare bene in quei casi.

Ma negli molto grandi casi, dove ci sono decine di tipi di entità e centinaia di proposte rilevanti sulla base di tali entità e le loro relazioni, il tentativo di costruire uno schema che è "materia in oggetto agnostica" ha spesso portato a un disastro. Questi disastri di sviluppo sono ben documentati, e i disastri più grandi coinvolgono milioni di dollari di fatica sprecata.

Non posso provarvi che un tale approccio deve condurre al disastro. Ma imparare dagli errori degli altri è spesso molto più utile che correre il rischio di ripeterle.

Di sicuro, l'accesso ai dati in tabella unita sarà più lenta, sempre. Ma con gli indici corretti potrebbe essere rallentamento accettabili (come 2x).

Vorrei spostare gli elementi comuni che si utilizzano nelle query nella tabella degli elementi, e lasciare in item_data valori avete solo bisogno di visualizzazione, che non sono usi a cui e JOIN condizioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top