В оригинальном коде, разработанном для реляционной модели, внешний ключ мог ссылаться на несколько первичных ключей в разных таблицах, и ссылочная целостность была действительной, если в какой-либо одной таблице содержалось значение.
К сожалению, SQL является бледнымотражение этого первоначального видения, поскольку, как вы уже отметили, оно не предоставляет этой способности.
Один из стандартных способов обхода проблемы - создать новое отношение, которое содержит ключи ко всем остальным.Но это не очень хорошее решение в этом случае, так как оно создает точку разногласия, если много вставок происходит одновременно.
Я бы справился с этим, чтобы создать значение - давайте назовем его КомментарийЯкорь - который вы можете поместить в каждую таблицу, в которой должны быть комментарии.Это значение (в отличие от всех других ключей в хорошо спроектированной базе данных) должно быть GUID.Тогда у каждого комментария может быть привязка к комментарию, указывающая, на какое значение он ссылается.
Делая его GUID, вы всегда можете вставлять уникальные значения в свой блог или учебник или что-то подобное, без спора.Вам не нужно вести основной список привязок комментариев, и ни один раздел не конкурирует с другим разделом или не блокируется им.
Это будет хорошо работать для обычного сценария поиска всех комментариев.например, для отдельной записи в блоге.Чтобы пойти другим путем, от комментария к тому, что комментируется, вы можете поставить флаг в таблице комментариев, указывающий, к какой таблице делается ссылка, но я бы не стал этого делать.Я бы просто обыскал все таблицы, может быть, с видом или что-то.Обратный запрос был бы достаточно редким, так что я не вижу особого смысла в поддержании инфраструктуры для него, и этот флаг был бы избыточными данными, что является проклятием СУБД.
Еще одно преимущество этой системы -что это легко растяжимо.Если вы создаете новый тип данных или решаете добавить комментарии к существующему типу данных, вам нужно всего лишь добавить столбец Comment-Anchor в таблицу.Никакой дополнительной работы не должно быть сделано на стороне базы данных.И даже часть промежуточного программного обеспечения, которая обрабатывает комментарии, не нуждается в модификации каким-либо образом, поскольку она не знает, какие вещи принимают комментарии.