2013-11-27 3 views
2

Мне нужно убедиться, что каждый проект в моей базе данных имеет контактное лицо. «проекты» и «контакты» имеют отношение «многие ко многим», указанные в таблице «projects_contacts». Могу ли я создать ограничение таблицы в проектах, которые будут указывать, что проект должен существовать в таблице соединений? Или мне нужно использовать совершенно другой подход?
(Мне нужно, чтобы пользователи могли вручную вводить контактные данные, находясь в середине добавления данных проекта, поэтому я обеспокоен тем, что NOT NULL свяжется с их способностью создать проект до того, как появится контакт.)Применить ограничение, отличное от нуля, через отношения «многие ко многим»?

Будет ли это лучше адресовано в сборке пользовательского интерфейса?

Спасибо!

CREATE TABLE projects(
id_project INTEGER PRIMARY KEY, 
description text) 

CREATE TABLE contacts(
id_contact integer PRIMARY KEY 
firstname varchar(100)) 

CREATE TABLE projects_contacts(
id_projects_contacts integer PRIMARY KEY,> 
id_project integer, 
id_contact integer 
CONSTRAINT FOREIGN KEY project_fkey (id_project) REFERENCES projects ON UPDATE CASCADE ON DELETE CASCADE 
CONSTRAINT FOREIGN KEY contact_fkey (id_contact) REFERENCES contacts ON UPDATE CASCADE ON DELETE CASCADE) 
+0

Для пользователей, которые обращаются к базе данных через Интернет, добавив один проект за раз, я буду использовать подсказку Билла: «Поэтому большинство вы можете отложить ограничение до фиксации: http://www.postgresql.org/docs/ 9.3/static/sql-set-constraints.html « – ptel

+0

Для администраторов, которым необходимо либо добавить один проект за один раз, либо импортировать большие наборы данных, мне придется подумать, нужно ли мне ограничение NOT NULL в таблице join_contacts projects. – ptel

+0

С ограничением NOT NULL администраторы будут затруднены в своих вариантах для перекрестных данных в нашей базе данных. Однако без ограничения NOT NULL администраторы должны знать, чтобы проверить, что все проекты имеют контакты (и что нет контактов без проектов) - после пешеходного перехода. Или ... Я могу написать сценарий для запуска, который выполняет проверку? – ptel

ответ

1

Единственный способ вы могли бы реализовать это с ограничением на уровне таблицы для projects содержать ненулевую внешний ключ ссылку на любую запись в projects_contacts. Но это было бы круговой ссылкой, так как projects_contacts также зависит от `проектов.

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

Нет ограничений, что означает «Мне нужно, чтобы это было непустым, но позже». В определении любого ограничения оно должно быть удовлетворено к моменту окончания транзакции.

Поэтому большинство вы можете отложить ограничение до фиксации: http://www.postgresql.org/docs/9.3/static/sql-set-constraints.html

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

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

1

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

Таким образом, вы не нуждаетесь в FK, чтобы допускать нули.

Однако, с точки зрения бизнеса, что бы вы сделали, когда контакт больше не является контактом для проекта, и никакой заменяющий контакт не назначен?

В этом случае ваша компания должна принять решение. Если это так, FK должен разрешить nulls при обновлении.

Чтобы комбинировать оба случая, ваш FK должен допускать нулевые значения, но ваш бизнес-уровень не должен принимать транзакцию проекта с нулевым контактом fk.

Вам также необходимо подумать об этом деловом вопросе: мог ли контакт существовать без проекта? Ответ важен в вашем графическом интерфейсе.

Согласно вашему утверждению «Мне нужно, чтобы пользователи могли вручную вводить контактные данные, находясь в середине добавления данных проекта». Это имеет смысл для меня, только если контакты будут непосредственно добавлены в текущий проект, но что если пользователь начинает создавать проект, создайте контакт, а затем откажитесь от процесса создания проекта? Как бы вы определили добавленный контакт? Таким образом, возможно, вы хотите уточнить это требование.

Смежные вопросы