Мне дали таблицу, которую я не знаю, как ее спроектировать. Я надеюсь на некоторые дизайнерские предложения или указатели в правильном направлении. Таблица называется edge
и предназначена для хранения некоторых трассировок событий и идентификаторов, которые связываются с хостом из возможных таблиц поиска. Оставляя все, кроме идентификаторов, вот что содержит таблица, все UUID:
ID
InvID
OrgID
FacilityID
FromAssemblyID
FromAssociatedTo
FromAssociatedToID
FromClinicID
FromFacilityDepartmentID
FromFacilityID
FromFacilityLocationID
FromScanAtFacilityID
FromScanID
FromSCaseID
FromSterilizerLoadID
FromWasherLoadID
FromWebUserID
ToAssemblyID
ToAssociatedTo
ToAssociatedToID
ToClinicID
ToFacilityDepartmentID
ToFacilityID
ToFacilityLocationID
ToNodeDTS
ToScanAtFacilityID
ToScanID
ToSCaseID
ToSterilizerLoadID
ToUserName
ToWasherLoadID
ToWebUserID
Это огромное количество идентификаторов, к которым можно присоединиться. Я помню, как читал, что планировщик Postgres сдается, когда у вас есть дюжина + присоединений. Идея состоит в том, что существует так много вариантов для изучения, что время планирования может быстро превзойти время запроса. Если вы свести это к минимуму, ссылки «от» и «к» всегда будут иметь только одно ключевое значение во всех этих полях. Итак, реализовано как полиморфные / беспорядочные связи, что-то вроде этого:
ID
InvID
OrgID
FacilityID
FromID
FromType
ToID
ToType
ToWebUserID
Эта таблица будет огромной, поэтому скорость будет учитываться.
Я поддержал автора не использовать полиморфный c дизайн, хотя привлекательность очевидна. (Мне нравится книга Карвина SQL Antipatterns .) Но теперь, столкнувшись с почти тремя дюжинами идентификаторов, я немного озадачен.
Есть ли общее решение такого рода проблем? А именно, где у вас есть такая центральная таблица с подключениями к большому количеству возможных таблиц? У меня нет опыта работы с хранилищами данных, но это выглядит примерно так. (Автор этой таблицы читал книги Кимбалла, но не реализовал никаких реализаций хранилищ данных.)
Важно: мы используем JOIN
для поиска связанных значений, которые могут измениться, мы не , используя его для изменения размера набора результатов. Просто представьте, что это всегда будет LEFT JOIN
.
Имея это в виду, я подумал о том, чтобы пропустить присоединение по идентификаторам From
и To
и вместо этого использовать вызовы пользовательских функций для просмотра вверх требуемые значения из связанных таблиц. как (псевдокод)
GetUserName(uuid) : citext
...and os on for other values of interest in this and other tables...
Функция вернет '', когда UUID равен 0000et c.
Я понимаю, что это не самый четкий вопрос в истории ТАК, и я надеюсь на указатели в плодотворном направлении.