Questo sound design del database è completamente normalizzato?

3

Sto creando un database per memorizzare le parole. L'utilizzo previsto è di interrogare il database per trovare una parola corrispondente a un set di filtri. Per esempio. se volessi trovare una parola con < 10 lettere, < 3 sillabe, fa rima con "at" e corrisponde al tag "animal", restituisce "cat", "bat", "wombat" ...

Non normalizzata, la tabella sarebbe simile a questa: (la chiave primaria è contrassegnata da PK, le informazioni contestuali sono fornite tra parentesi quadre)

Word(
    WordID PK,
    Word,
    AltSpelling, [another accepted variant e.g. "color"/"colour"]
    Rhyme, [the rhyme part of the word, e.g. for "wombat" the rhyme is "at"]
    Pronunciation, [how the word is pronounced in IPA]
    SyllableCount,
    Tags, [tags relate to meaning of the word, e.g. "apple" would have the tags "round", "fruit", "plant" etc.]
    Categories, [categories are how the word would be hierarchically categorised, e.g. cat comes under the category "animal"]
    WordClasses [the word class that a word can be used as, e.g. "rest" can be Noun and Verb]
)

Questo è il diagramma Entità-Relazione per descrivere come dovrebbe funzionare il database:

E infine, questa è la soluzione che ho trovato per un design di database normalizzato. FK indica la chiave esterna, CPK è la chiave primaria composta.

Word(WordID PK, Word, OtherSpelling, RhymeID FK, SyllableCount)
Rhyme(RhymeID PK, Rhyme)
Pronunciation(PronID PK, WordID FK, Pron, DialectApplicable [the dialect in which the pronunciation is used, e.g. RP, SE, BrE, AmE])
Tag(TagID PK, TagName, TagReferentCount [the number of words to which the tag applies])
WordTag(WordID CPK FK, TagID CPK FK)
Category(CategoryID PK, CategoryName, CategoryReferentCount [cf. TagReferentCount for categories])
WordCategory(WordID CPK FK, CategoryID CPK FK)
Class(ClassID PK, ClassName, ClassReferentCount [cf. TagReferentCount for word classes])
WordClass(WordID CPK FK, ClassID CPK FK)

La domanda è duplice: questo progetto di database è completamente normalizzato? E ancora più importante, è suono? Non ho esperienza pratica con i database, quindi mi piacerebbe sapere se ho commesso errori o se il design può essere migliorato / ottimizzato.

    
posta Lou 25.06.2014 - 13:24
fonte

4 risposte

8

è completamente normalizzato? n.
ci sono problemi con esso? possibilmente sì.

Solo un esempio: "otherpelling" come un campo nella tabella delle parole rompe sia la normalizzazione sia un problema.
Cosa succede se una parola ha più ortografie alternative?
E oh, non dovresti mirare alla completa normalizzazione. Completa normalizzazione è di per sé un potenziale problema, soprattutto per le prestazioni.
Normalizza dove ha senso, denormalizza dove ha senso.

    
risposta data 25.06.2014 - 13:33
fonte
3

La violazione più evidente della normalizzazione nel tuo DB sono gli attributi di conteggio di riferimento: introducono informazioni ridondanti e potrebbero essere "fuori sincronia" con il numero reale di riferimenti.

"OtherSpelling" potrebbe essere una violazione della normalizzazione, oppure potrebbe non esserlo, questo dipende in effetti dai dati che stai per memorizzare.

Penso che sia discutibile se, dal momento che entità come Tag, Category o Otherspelling sono anch'esse parole per sé stesse, dovresti davvero memorizzarle in tabelle separate, o invece usare un riferimento alla pagina WordTag o WordCategory alla Word tavolo.

    
risposta data 25.06.2014 - 13:36
fonte
3

is this database design fully normalised?

Ci sono molte forme normali. Questo design è in gran parte 3NF, ad eccezione delle tre colonne ReferenceCount . In quanto tale, è conforme alla pratica comune nel settore dello sviluppo del software.

is it sound?

Sì, dato i tuoi commenti all'altra risposta, non sarei arrabbiato se uno dei miei sviluppatori lo suggeriva come schema.

Vorrei sapere se ci dovrebbe essere un'altra tabella tra Word e Rhyme . Combattere e rima wombat su "at" o "om" o su entrambi? SyllableCount potrebbe variare con la pronuncia?

    
risposta data 25.06.2014 - 14:06
fonte
3

Il modello non è normale

  • OtherSpelling dovrebbe essere un'entità separata denominata Spelling
  • DialectApplicable dovrebbe essere un'entità separata denominata Dialect
  • TagReferentCount deve essere calcolato
  • CategoryReferentCount dovrebbe essere calcolato
  • In WordTag , WordID e TagID dovrebbero essere FK separati oltre al CPK
  • In WordCategory , WordID e CategoryID dovrebbero essere FK separati oltre al CPK
  • In WordClass , WordID e ClassID dovrebbero essere FK separati oltre al CPK
  • ClassReferentCount deve essere calcolato
  • Nel grafico, la cardinalità è invertita per le tabelle WordTag , WordCategory e WordClass , (il tridente dovrebbe essere sulla tabella N: N)
risposta data 25.06.2014 - 14:32
fonte