Да, есть намного более чистый способ сделать это:
- одна таблица отслеживает отношения между Разделом и Разделом и применяет их как ограничения внешнего ключа
- одна таблица отслеживает отношения между Разделом и Контентом и применяет их как ограничения внешнего ключа
- одна таблица отслеживает отношения между содержимым и разделом и применяет их как ограничения внешнего ключа
- одна таблица отслеживает отношения между контентом и контентом и применяет их как ограничения внешнего ключа
Это намного чище, чем отдельная таблица с перегруженными идентификаторами, которые не могут быть применены ограничениями внешнего ключа. Тот факт, что моделирование данных или шаблоны моделирования доменов никогда не упоминают шаблон, подобный описанному вами, должен быть вашим первым сигналом тревоги. Второй сигнал тревоги должен заключаться в том, что движок не может навязать ограничения, которые вы предполагаете, и вы должны погрузиться в триггеры.
Наличие четырех различных взаимосвязей, смоделированных в одной таблице, не придает модели элегантности, а только добавляет запутанность. Реляционная модель не C ++: у нее нет наследования, у нее нет полиморфизма, у нее нет перегрузки. Попытка навязать ОО-подход к моделированию данных привела многих изящных разработчиков к путанице с неуправляемой триггерной сеткой битов, похожих на таблицы, которые смутно напоминают «данные».