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.