Sql - косвенный внешний ключ
У меня есть несколько вопросов по поводу дизайна базы данных.
Есть ли имя для этого?Это хорошая практика?Какие-либо соображения производительности?У меня есть общая структура таблицы, используемая для хранения отношений.
Недавно я изменил некоторые вещи, чтобы использовать эту общую структуру вместо прямых столбцов Fk, но теперь я не уверен, что это действительно лучшая идея.
Исходная схема:
+------------------+ +---------------------+ +----------------------+ | Book | | Note | | MetaParent | |------------------| |---------------------| |----------------------| | Id | | Id | | Id | | NoteId | | MetaParentId:(Null) | | MetaTableId | | +-------+ +----+ KeyValue | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +------------------+ +---------------------+ +----------------------+
Новая схема
+------------------+ +---------------------+ +----------------------+ | Book | | Note | | MetaParent | |------------------| |---------------------| |----------------------| | Id | | Id | | Id | | | | MetaParentId:(Null) | | MetaTableId | | + + +----+ KeyValue | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +------------------+ +---------------------+ +----------------------+
Таким образом, в основном вместо прямой связи Fk между Book и Note у нас есть косвенная связь через таблицу MetaParent с использованием столбцов MetaTableId / KeyValue.
В настоящее время таблица MetaParent имеет около 500 тыс. Записей, и все работает приемлемо. Но мы перестраиваем индексы каждую ночь.
Меня беспокоит то, что теперь отношения между Книгой и Заметкой не очевидны. Вы должны знать, что он существует, и использовать таблицу MetaParent.
Кроме производительности, я не уверен, в какой момент у нас возникнут проблемы с объединениями из-за медленной работы MetaTableId / KeyValue. Кажется, чем больше вы добавляете в эту таблицу, тем медленнее получаются запросы.