Последнее время часто сталкиваюсь такой проблемой.
Немного искусственный пример: журнал событий, причем события разных типов, у которых разные свойства, но есть несколько общих - время, источник. Нужно показывать события разных типов в общем потоке, отсортированном по времени, но с возможностью фильтровать по типу. Еще нужно иметь возможность из еще какой-нибудь другой таблицы ссылаться на события разных типов.
Первое, что приходит в голову - избыточный набор полей для свойств, поле type и NULL во полях, специфичных для типов, к которой запись не принадлежит.
Еще вариант - отдельная «агрегирующая» таблица с общими полями и nullable внешними ключами для всех возможных типов. Тогда нужно следить, чтобы для каждой записи был установлен один и только один внешний ключ из возможных и чтобы на каждую запись из таблиц с типоспецифичными полями указывала только одна запись из агрегирующей.
Как принято поступать в таком случае?