Er zijn een paar dingen waar u rekening mee moet houden:
- Verandert de lijst met kenmerken aanzienlijk in de loop van de tijd
- Vereist de lijst met attributen aangepaste gebruikersattributen
- Zijn er verschillende attributen voor verschillende scholen (d.w.z. veel kenmerken zijn alleen van toepassing op één of enkele scholen)?
Als een van deze waar is, kunt u denken aan een benadering van een property store zoals EAV, hstore, json velden, xml-velden, enz. .
Als dat niet het geval is - als u een vrij statische lijst met eigenschappen hebt waarvan de meeste logisch zijn voor de meeste rijen - dan is er niet echt een probleem om ze als 60 afzonderlijke kolommen te hebben. Het zal gemakkelijker zijn om indexen toe te voegen voor vaak gezochte sets van attributen, inclusief gedeeltelijke en samengestelde indexen, enz., en zoekopdrachten - vooral die voor veel verschillende attributen - zullen veel zijn sneller.
Er is ook een compromisoptie voor u beschikbaar:een hoofdtabel voor de belangrijkste details die u veel opzoekt, plus zijtabellen voor logische groeperingen van attributen. Zeg:
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,
...
)
etc. De integer primary key
dat is ook een foreign key
betekent dat je een afgedwongen 1:1 (optioneel) relatie hebt met de andere tabel. Deze aanpak kan handig zijn als je een paar logische groeperingen van attributen hebt die je kunt clusteren in bijtafels.
Het zou me ook verbazen als een beetje meer nadenken geen dingen zou onthullen die doen zin om te normaliseren. Heb je year7_blah
, year8_blah
, year9_blah
enz kolommen? Zo ja:geweldige kandidaat voor normalisatie.