2017-01-05 10 views
0

Я разрабатываю базу данных для использования в сценарии с несколькими арендаторами. Я недавно узнал, что для обеспечения того, чтобы tenant_ids были согласованы между таблицами, которые ссылаются друг на друга, мне нужно, чтобы первичный ключ таблиц включал как идентификатор таблицы, так и tenant_id. Затем внешние ключи должны ссылаться как на идентификатор таблицы, так и на tenant_id.SQL-схема с ограничениями внешнего ключа для арендаторов

Кажется, что это работает по назначению, но что делать, если у меня есть таблицы, которые не ссылаются на арендатора? В моем примере ниже у меня есть playlist_item, который напрямую не ссылается на арендатора. Проблема, которую я вижу здесь, заключается в том, что playlist_item потенциально может ссылаться на часть контента, которая не имеет того же арендатора, что и список воспроизведения.

Возможным решением будет также включение tenant_id во все таблицы, существующие в базе данных, чтобы иметь возможность постоянно ссылаться на арендатора, но для меня это кажется немного громоздким, потому что playlist_item (в данном случае) уже имеет подразумеваемый tenant_id через свои отношения владельца с плейлистом.

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

(Это просто пример, а не фактической базы данных)

Sample schema design

+1

Столбцы с привязкой (во внешнем ключевом отношении) должны всегда формировать уникальный уникальный ключ (первичный ключ или уникальное ограничение в PostgreSQL) в ссылочной таблице. Таким образом, вы фактически не можете создать пример выше, если только 'id' является первичным ключом как в« списке воспроизведения », так и« content ». Если это уникальное ограничение, то нет смысла, чтобы он был «просто» частью первичного ключа (потому что он уникален сам по себе). Другими словами: вы должны решить, какие объекты могут иметь перекрывающиеся идентификаторы (для арендаторов). Ваша таблица 'user' f.ex. мог бы иметь. – pozs

+0

Вы правы, мне также нужно иметь уникальный индекс на идентификаторе таблицы. В результате: Первичный ключ (id, tenant_id) и Unique (id). Правильно? – Patrik

+0

это технически возможно, но первичный ключ всегда должен быть наименьшим набором уникальных столбцов. Таким образом, существует одна возможность создать ваши таблицы с «id» в качестве первичного ключа и включать в себя «tenant_id» на * некоторые из них (если они могут быть подключены к арендаторам через другие внешние ключи, тогда это не требуется) или использовать ' id' + 'tenant_id' везде. – pozs

ответ

1

У вас есть два основных варианта здесь.

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

В этом случае плейлист будет иметь второй уникальный индекс на (id, tenant_id), а playlist_item будет иметь внешний ключ на (playlist_id, tenant_id), ссылаясь на это.

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