EventCategory
=============
EventCategoryId PK,
Name
Event
=====
EventId PK,
EventCategoryId FK,
Name
This is what I've got now. However, events of some event category type need extra data fields. So where do these fields go? This is what I'm thinking…
EventCategory
=============
EventCategoryId PK,
Name
Event
=====
EventId PK,
EventCategoryId FK,
Name
SpecialEvent
============
EventId PK,
Extrafield
So there's a 1-1 relationship between Event and Special Event (this structure will map to a single SpecialEvent class in C#) and all events and only those events that reference the pertinent category will have a row in this new table.
Is this a fair design? My qualm is that an event will have a a corresponding row in the SpecialEvent table and yet won't reference the required event category or vica versa.
Best Answer
What you are doing here is called specialization.
You can look at this answer to a similar question at stackoverflow which will point you in the right direction. I've implemented a slightly modified version with success.
Edit: I've created an example for your situation. (Don't mind the sample data ;) )
You can query the events like this:
SQL Fiddle: http://sqlfiddle.com/#!6/d1911/1/0