Inheritance and its alternatives in PostgreSQL
It is hard to answer the question as written.  The simplest solution would probably be something like a context table with types listed as they are.  What I am not sure about is what you need in terms of linking to this table.  In other words, have all the common fields for context in the context table plus a type field that tells you what kind of context it is.  Other tables can then join that to provide more information about the types.

The problems you mention with the 1:1 design can be solved with composite foreign and primary keys.  It may seem like field duplication but keep in mind your primary key is multi-field so your foreign keys would need to be also.  This allows you to ensure that different dependent tables do not overlap where you do not want them to do so.

The second solution is to use inheritance.  In my view, inheritance is going to be a good solution if the following are true:


The context records have foreign keys that reference other tables depending on subtype, and
No tables reference context as such but rather the subtype directly.


My guess is that in your case the second condition will not be met and therefore I would not recommend table inheritance for you.