Как применить ограничения базы данных между двумя внешними ключами в таблице соединений? - PullRequest
0 голосов
/ 18 января 2019

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

Вот мои таблицы:

Dataset

Tag
 - Dataset: FK
 - name: string (eg: "park", "church", etc)

Place
 - Dataset: FK
 - latitude
 - longitude

PlaceTag (my join table)
 - Tag: FK
 - Place: FK
 - note: string (eg: "this place is my favorite park")

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

FWIW, это проект с открытым исходным кодом, и мой PR для создания этих таблиц здесь: https://github.com/mapseed/api/pull/161/files Проектиспользует Django, если это поможет.

1 Ответ

0 голосов
/ 18 января 2019

Одним из способов «принудительного» (обратите внимание на кавычки) этого в Django было бы переопределение метода PlaceTag save(). Там вы можете вызвать исключение всякий раз, когда self.place.dataset != self.tag.dataset. Тем не менее, вы должны заметить, что есть ситуации, в которых Django не будет вызывать пользовательский save() метод модели:

  1. При вызове метода update() в наборе запросов. Этот метод предназначен для массовых обновлений и, следовательно, по соображениям производительности, выполняет обновление непосредственно на уровне базы данных (ссылка) .
  2. Внутренние (данные) пользовательские миграции save() методы недоступны.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...