Der er et par ting at overveje her:
- Ændrer listen over attributter sig væsentligt over tid
- Kræver listen over attributter tilpassede brugerdefinerede attributter
- Er der forskellige attributter for forskellige skoler (dvs. mange attributter gælder kun for en eller nogle få skoler)?
Hvis nogen af disse er sande, kan du overveje en ejendomsbutikstilgang som EAV, hstore, json felter, xml-felter osv. .
Hvis ikke - hvis du har en ret statisk liste over egenskaber, hvor de fleste af dem giver mening for de fleste rækker - så er der ikke rigtig noget problem med at have dem som 60 individuelle kolonner. Det bliver nemmere at tilføje indekser for almindeligt søgte efter sæt af attributter, inklusive delvise og sammensatte indekser osv., og søgninger - især dem efter mange forskellige attributter - vil være meget hurtigere.
Se også:Databasedesign - skal jeg bruge 30 kolonner eller 1 kolonne med alle data i form af JSON/XML ?
Der er også en kompromismulighed tilgængelig for dig:En hovedtabel for de vigtigste detaljer, du slår meget op, plus sidetabeller til logiske grupperinger af attributter. Sig:
yearly_summary (
yearly_summary_id serial primary key,
school_id integer,
total_students integer,
...
)
plus
yearly_student_stats(
yearly_summary_id integer primary key references yearly_summary(yearly_summy_id) on delete cascade,
...
)
osv. integer primary key
det er også en foreign key
betyder, at du har et håndhævet 1:1 (valgfrit) forhold til den anden tabel. Denne tilgang kan være nyttig, hvis du har et par logiske grupperinger af attributter, som du kan gruppere i sidetabeller.
Jeg ville også blive overrasket, hvis lidt mere eftertanke ikke afslørede ting, der gør giver mening at normalisere. Har du year7_blah
, year8_blah
, year9_blah
osv kolonner? Hvis ja:God kandidat til normalisering.