Ci sono alcune cose da considerare qui:
- L'elenco degli attributi cambia in modo significativo nel tempo
- L'elenco degli attributi richiede attributi personalizzati definiti dall'utente
- Ci sono attributi diversi per scuole diverse (cioè molti attributi si applicano solo a una o poche scuole)?
Se uno di questi è vero, potresti pensare a un approccio al negozio di proprietà come EAV, hstore, json campi, campi XML, ecc .
In caso contrario, se si dispone di un elenco abbastanza statico di proprietà in cui la maggior parte di esse ha senso per la maggior parte delle righe, non c'è davvero un problema con averle come 60 singole colonne. Sarà più facile aggiungere indici per insiemi di attributi comunemente ricercati, inclusi indici parziali e compositi, ecc., e le ricerche, in particolare quelle per molti attributi diversi, saranno molto più veloce.
C'è anche un'opzione di compromesso a tua disposizione:una tabella principale per i dettagli più importanti che cerchi molto, più tabelle laterali per raggruppamenti logici di attributi. Dì:
yearly_summary (
yearly_summary_id serial primary key,
school_id integer,
total_students integer,
...
)
più
yearly_student_stats(
yearly_summary_id integer primary key references yearly_summary(yearly_summy_id) on delete cascade,
...
)
ecc. La integer primary key
è anche una foreign key
significa che hai una relazione 1:1 (opzionale) con l'altra tabella. Questo approccio può essere utile se hai alcuni raggruppamenti logici di attributi che puoi raggruppare in tabelle laterali.
Sarei anche sorpreso se un po' più di riflessione non rivelasse cose che fanno ha senso normalizzare. Hai year7_blah
, year8_blah
, year9_blah
colonne ecc? Se è così:ottimo candidato per la normalizzazione.