Ho un database incorporato (SQLite), memorizza informazioni su eventi e pagine viste, il suo scopo è di tracciare il percorso dell'utente all'interno della mia applicazione. Devo fornire supporto per proprietà personalizzate opzionali sui miei eventi e visualizzazioni di pagina.
Nel codice questo non è un problema, tuttavia sono diviso tra due soluzioni per la memorizzazione di tali informazioni.
Quindi ho le tabelle Events e PageViews, la mia prima opzione per mantenere le proprietà personalizzate opzionali è avere una tabella EventsCustomProperties che abbia solo una colonna nome e valore e un riferimento (chiave esterna) all'evento. In questa soluzione avrei anche un PageViewCustomProperties con la stessa struttura.
Il problema che ho con questo è avere due tabelle identiche a quelle delle altre relazioni.
Nella mia altra soluzione avrei una tabella CustomProperties e, oltre al nome, valore e chiave di relazione, avrebbe anche una colonna type, che dovrei usare manualmente nel codice per mappare l'id della relazione a un evento o una visualizzazione di pagina. In questa soluzione l'uso effettivo delle chiavi esterne è ridondante.
Il mio dilemma è che nella prima soluzione sto rispettando una regola di normalizzazione di ripetizione di gruppi di dati, compro nella seconda soluzione sto infrangendo un'altra regola anche se non riesco a farmi ricordare il nome della regola.
Quindi sembra che infrangerò le regole qualunque cosa faccia. Qualcuno può suggerire un modo migliore o una preferenza per la prima o la seconda soluzione.