У меня есть 3 таблицы таблиц с именами «Проекты», «Контракты» и «Инциденты». Конструкция предназначена для системы технического обслуживания на основе проекта. Клиенты могут заключать контракты на проект по обслуживанию различных установок. Кроме того, отдельные инциденты, которые могут или не могут быть связаны с контрактом по проекту, должны быть отчетными, например, как дефектные установки.Внешние ключи как к родителям, так и к родительским родителям
Проекты имеют от 1 до многих отношений с Контрактами (каждый Проект может иметь несколько Контрактов или ни одного). Запись об инцидентах в конечном итоге должна быть разрешена для Проекта, но не всегда требует наличия контракта. В некоторых случаях может оказаться, что у проекта нет контрактов, но он должен иметь возможность иметь Инциденты.
Наш разработчик базы данных предложил, чтобы инциденты имели внешний ключ к проектам и контрактам. Фактически это отношения, которые имеют отдельные ключи к родителям и дедушкам и бабушкам, чтобы обеспечить отсутствие родительской записи. Альтернативой является создание «фиктивного» контракта. Ни одно из решений не имеет моих предпочтений.
Чтобы усугубить ситуацию, в Договоре также упоминается «Должник» из другой таблицы. Поэтому в отсутствие Контракта Инцидент должен также иметь возможность обратиться к Должнику.
Я не могу не чувствовать, что предлагаемый подход является нарушением всех нормальных форм и может создавать будущие проблемы, в том числе проблемы обслуживания, поэтому я ищу альтернативное решение, способное поддерживать целостность через таблицы. Кроме того, кто-нибудь знаком с дальнейшими проблемами, которые может вызвать такой подход?
Для чего это стоит, я разработчик, отвечающий за письмо приложения, которое будет работать с этой базой данных. Проект должен быть создан в WPF с LINQ над SQL. Одним из требований является то, что он должен иметь возможность запрашивать запись Project для всех ее инцидентов, в том числе те, на которые ссылаются через Контракты.
Я искал похожие вопросы о SO, и хотя есть много дел с ключами дедушки и бабушки, ни один из них, похоже, не соответствует моей проблеме.
Альтернатива условным нулевым внешним ключам для одной из трех таблиц, я думаю, будет иметь отдельные таблицы «ProjectIncident», «ContractIncident» и «DebtorIncident», которые вы могли бы придать фантазии и суперкласса «Таблице за класс» наследование ('BaseIncident') без внешних ключей? – StuartLC