Рассмотрим модель измерений с таблицами фактов, такими как (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
, а затем добавить проверочные ограничения для ограничения по измерению? Или ссылочная целостность требует, чтобы я отказался от еще большего и просто принял все отдельные идентичные таблицы?
(Влияние ограничений на производительность записи не важно; производительность чтения является целью проектирования.)