2009-06-26 8 views
7

Una VISTA SQL è una tabella logica globale che può essere o non essere mantenuta. Ma è ancora un tavolo. Pertanto, una VISTA dovrebbe sempre aderire alla prima forma normale (1NF)? cioè senza righe duplicate, solo scalari, senza ordinamento da cima a fondo o da sinistra a destra, ecc. Che dire delle forme normali più alte?Una VISTA SQL dovrebbe sempre essere in 1NF?

Per me, le mie applicazioni "consumano" i risultati dei processi memorizzati, le mie VISUALIZZAZIONI vengono "consumate" da query SQL e questi due usi si escludono a vicenda (ovvero non interrogare i gruppi di risultati dei processi memorizzati utilizzando SQL e le mie applicazioni non contengono codice SQL). Ho visto altri che usano una VISTA per "concatenare" più valori in una colonna in una singola riga, in genere in formato separato da virgole. Scrivendo predicati in una query SQL contro una tale colonna richiede un kludges simili a questo:

',' + concat_col + ',' LIKE '%' + ',' + search_value + ',' + '%' 

Quindi mi sembra ragionevole aspettarsi tutte le tabelle che possono essere interrogati consistere di soli tipi scalari. Sono troppo "purista" pensando questo?

risposta

3

Ha perfettamente senso garantire che le visualizzazioni siano normalizzate ad almeno 1 NF. Ad esempio, consentire duplicati ha lo svantaggio che il significato della vista è reso ambiguo e le informazioni possono essere erroneamente identificate dagli utenti. Potrebbero verificarsi dati errati se le tabelle vengono aggiornate in base a tali ambiguità.

E.F.Codd non è stato necessariamente d'accordo. Nel suo libro sulla versione 2 di RM, propone di autorizzare la visualizzazione senza chiavi, un grosso errore, credo. Le viste di Codd non consentono effettivamente duplicati, ma consentono a tutte le colonne di essere annullabili e quindi non hanno le chiavi e non sono in 1NF.

Un valore stringa contenente un elenco delimitato da virgole non è di per sé una violazione di 1NF. Un valore stringa è uno scalare come qualsiasi altro valore, qualunque esso contenga. La maggior parte dei DBMS SQL non consente attributi multivalore.

9

No: creo le viste per abbinare l'output richiesto dal mio programma.

+0

miei punti di vista sono 'consumati' da solo le query SQL. Se il mio programma ha bisogno di un set di risultati in un formato "speciale", lo farei in un processo memorizzato o nel livello intermedio. Non sto suggerendo che l'output di ogni proc memorizzato dovrebbe essere in 1NF, solo l'output che è nella forma di una * tabella * (e suppongo che includerebbe le variabili di tabella dove applicabile). – onedaywhen

+0

Hai ovviamente creato regole per la tua applicazione (nessun SQL nei client, ad esempio) che funzioni per te. Sono più restrittive di quelle che considererei le migliori pratiche, ma la cosa bella dell'essere troppo restrittive è che è sempre facile cambiare idea in seguito ed essere più rilassati, non è così facile andare dall'altra parte. Generalmente, l'output delle visualizzazioni può violare 1NF (sebbene le righe duplicate siano inutili, AFAIK). In effetti, l'utilizzo di viste brutte è uno dei modi migliori per migrare un design brutto in un design pulito: è necessario che le viste supportino i client legacy fino a quando non vengono risolti. –

4

L'intero punto dei sistemi relazionali consiste nel mantenere i dati in relazioni normalizzate per efficienza e/o gestibilità e quindi utilizzare gli operatori relazionali per convertirli nelle relazioni necessarie.

Una vista non materializzata non viene memorizzata, è una query.

Ecco perché è necessario crearlo nel formato più adatto alle esigenze delle applicazioni.

Vedere this answer per ulteriori dettagli.

1

Non penso che questa sia una regola, ma se lo fosse - Nessuna regola dovrebbe sempre essere seguita.

+1

Penso che l'approccio accettato sia che tu segui le "regole" della normalizzazione, quindi segui le "regole" della denormalizzazione se ci sono buone ragioni per farlo. A meno che tu non sia un anarchico, in questo caso le regole sono che non ci sono regole, combatti il ​​potere, pantaloni bondage, complimenti a te. – onedaywhen

0

una vista (a meno che non si materializza/vista indicizzata) non è altro che una query memorizzata Visualizzazioni può contenere più di un tavolo, possono avere auto si unisce allo stesso tavolo etc etc

+0

Infatti e posso unire una tabella visualizzata (a.k.a. VIEW) ad altre tabelle ... quindi sarebbe davvero di grande aiuto se tutte le colonne fossero di tipo scalare. – onedaywhen

+0

... Ho aggiunto una descrizione di questo utilizzo e le implicazioni per 1NF alla mia domanda. – onedaywhen

-2

No - la normalizzazione regole si applicano a la persistenza dei dati, non la loro presentazione. Ad esempio, qualsiasi riga duplicata in una vista potrebbe interrompere 1NF, che è ovviamente eccessivamente restrittiva.

Per ulteriori informazioni, vedere First normal form.

+0

Come è utile una VISTA con righe duplicate? Hai in mente un esempio di vita reale? Grazie. – onedaywhen

+0

Perché il downvote? – RedFilter

+0

Non rispondi alla mia cortese domanda ma ti aspetti una risposta alla tua? ;) Il downvote non era mio, però. – onedaywhen

0

Secondo Chris Data, opinioni dovrebbero essere completamente normalizzata:

La scelta su quale i rapporti si fanno quelli di base, e quali i punti di vista, è arbitraria. Come esempio banale, potresti avere dipendenti e potresti avere una relazione di base contenente tutti i dipendenti, e potresti avere dipendenti della Costa Orientale e dipendenti della West Coast come due punti di vista. Oppure potresti avere i dipendenti della Costa Orientale e della Costa Occidentale come due relazioni di base e ricavarne l'unione tra tutti. È completamente arbitrario.

DBMS Intervista a Chris Data - ottobre 1994

Problemi correlati