У меня есть две таблицы (endorsement
и work_data
) в моей базе данных, которые оба ссылаются на объекты ("работы"), внешние по отношению к моему проекту, то есть имеют идентификатор (pid
), который я не определил (сравните, например, ISBN для книг).
Для каждой существующей работы я могу добавить endorsement
, work_data
, оба или ни того, ни другого.
Теперь мой вопрос: могу ли я иДолжен ли я добавить внешний ключ, связывающий столбцы pid
как endorsement
, так и work_data
, учитывая, что в них может быть или не быть строк об этом pid
?Я хотел бы иметь возможность эффективно извлекать work_data
, если возможно, для работы, на которую ссылается данный endorsement
, и наоборот.
Я использую PostgreSQL, если это имеет значение.
Редактировать: По запросу, пример.Напечатано наизусть, поэтому не обращайте внимания на синтаксические ошибки - мне интересно узнать о дизайне базы данных и о том, какие соображения следует учитывать относительно эффективности того, что я хочу сделать.
endorsement
:
| pid | user |
| -- | -- |
| 10.0000/00 | 1 |
| 10.1111/11 | 1 |
(Таким образом, пользователь 1
одобрил две работы.)
work_data
:
| pid | title |
| -- | -- |
| 10.1111/11 | 'Some article that has an endorsement' |
| 10.2222/22 | 'Some other article that does not have an endorsement' |
(Итак, мы знаем о двух работах, одна из которых такжеперечислены в таблице endorsement
.
Теперь я хотел бы иметь возможность выбирать одобрения с присоединенными данными, например,
SELECT endorsement.*, pid.title FROM endorsement LEFT JOIN work_data ON endorsement.pid=work_data.pid;
| pid | user | title |
| -- | -- | -- |
| 10.0000/00 | 1 | NULL |
| 10.1111/11 | 1 | 'Some article that has an endorsement' |
Аналогично, я хотел бы бытьвозможность выбора рабочих данных с присоединенными одобрениями, например
SELECT work_data.*, endorsement.user FROM work_data LEFT JOIN endorsement ON work_data.pid=endorsement.pid;
| pid | title | user |
| -- | -- | -- |
| 10.1111/11 | 'Some article that has an endorsement' | 1 |
| 10.2222/22 | 'Some other article that does not have an endorsement' | NULL |