Рассмотрим размерную модель с таблицами фактов типа (fk_dim1value, fk_dim2value, ..., value)
, где fk_X
столбцы являются внешними ключами в соответствующие тривиальные таблицы измерений dim1value (id, value), dim2value (id, value),
и т. Д.
Эти таблицы фактов и измерений собираются автоматически из разрозненных источников, поэтому их много ... и они избыточны: все таблицы значений измерений структурно идентичны, (id, value)
, представляя простые коллекции текстовых значений без дополнительной семантики ( единственное отличие состоит в том, что разные внешние ключи ссылаются на них в различных таблицах фактов). Менее тривиальные размерные типы, вероятно, появятся позже, но набор различных типов размеров останется небольшим.
Поэтому я хочу объединить таблицы измерений в одну таблицу dimvalue (fk_dim, dimvalue_id, value)
, где fk_dim
ссылается на таблицу dimension (dim_id, name)
, а dimvalue_id
уникален только в пределах каждого измерения. Тогда естественный первичный ключ будет составным: (fk_dim, dimvalue_id)
.
Столбцы внешнего ключа таблицы фактов теперь все ссылаются на одну и ту же таблицу dimvalue (fk_dim, dimvalue_id, value)
... но, конечно, каждый столбец связан с определенным измерением и, таким образом, по-прежнему должен быть ограничен ссылкой на значения этого измерения конкретно (горизонтальный раздел унифицированного таблица dimvalue
).
Есть ли (разумный) способ сделать это?
Я имею в виду что-то вроде «наполовину составного» внешнего ключа, то есть ссылку из одного столбца на «срез» составного PK с фиксированным значением для другого столбца (столбцов). «Полностью составной» FK будет FOREIGN KEY (col1, col2) REFERENCES dimvalue (fk_dim, dimvalue_id)
, но здесь fk_dim
фиксировано, и поэтому «исходная» сторона ключа - это всего лишь один столбец, ссылающийся на второй столбец dimvalue
первичного ключа; что-то вроде FOREIGN KEY (fk_dim7value) REFERENCES dimvalue (fk_dim=7, dimvalue_id)
.
Возможно ли что-то подобное? Или я заблудился в этом последнем абзаце? Должен ли я отказаться и просто использовать внешний ключ для всей dimvalue
таблицы, а затем добавить проверочные ограничения для ограничения по размерности? Или ссылочная целостность требует, чтобы я отказался еще больше и просто принял все отдельные идентичные таблицы?
(Влияние ограничений на производительность записи не имеет значения; производительность чтения - это цель проекта.)