Как убедиться, что две таблицы внешних ключей, на которые ссылаются, имеют один и тот же внешний ключ к другой таблице?

#postgresql #relational-database

Вопрос:

Допустим, я хочу моделировать матрицы с различными формами и содержимым в реляционной базе данных (в моем случае PostgreSQL). Мы можем хранить несколько различных матриц. Каждая матрица содержит несколько строк и столбцов, каждая из которых может иметь некоторые свойства (например, имя, должность…). Мы можем хранить записи значений в каждой ячейке (комбинация строк и столбцов) матрицы.

Таким образом, у нас есть иерархическая структура с отношениями 1:n сверху вниз и строкой столбцом в качестве братьев и сестер, на которые ссылается запись.

введите описание изображения здесь

Таблицы строк и столбцов будут иметь matrixId внешний ключ. Таблица ввода будет содержать rowId и columnId в качестве внешних ключей.

Однако без дополнительных мер можно было бы создать запись, которая ссылается на строку и столбец, принадлежащие разным матрицам.

Какова наилучшая практика для обеспечения того, чтобы запись всегда ссылалась на строку и столбец с одним и тем же matrixId ?

Я предполагаю, что нам, вероятно, также понадобится matrixId поле в записи, хотя это внесло бы некоторую избыточность.

Комментарии:

1. Извините, я не понимаю графики и нечеткого текста. Пожалуйста, представьте свою модель как DDL.

Ответ №1:

Да, включите matrixid entry и в (не обязательно первичный)^1 ключ row и column вместе с rowid или columnid , соответственно, и сошлитесь на это entry .

И в качестве примечания: написано «PostgreSQL». «PostgreSQL» действительно больно…

^1: Хотя было бы разумно, что rowid или columnid являются порядковыми номерами строки или столбца в матрице, которые могли бы стать (matrixid, rowid) или (matrixid, columnid) хорошим кандидатом на первичный ключ.