Вот вопрос SQL Server / ADO.Net Entity Framework: я ищу «лучший» способ сделать это.
У меня есть иерархическая структура объектов, подобная следующей:
Company -> Division -> Department -> Group -> Specialty
Первичный ключ каждого (кроме Компании) состоит из внешнего ключа, указывающего на PK каждого из его предков.Итак, Specialty выглядит следующим образом:
[PK/FK] CompanyID (string)
[PK/FK] DivisionID (int)
[PK/FK] DepartmentID (int)
[PK/FK] GroupID (int)
[PK] SpecialtyID (int)
Name (string)
Description (string)
Эта базовая структура должна оставаться на месте по причинам, в которые я не буду вдаваться - поэтому, используя GUID, поскольку PK на самом деле отсутствует в картах - мыдолжны взаимодействовать с другими приложениями, использующими конструкцию идентификатора Bergdorf.6.3.4.1, которую отражает эта структура.
Теперь мне нужно добавить возможность добавить специальность, которая применяется квесь отдел, а не группа.Итак, в идеальном мире у нас было бы следующее:
[PK/FK] CompanyID (string)
[PK/FK] DivisionID (int)
[PK/FK] DepartmentID (int)
[PK/FK] GroupID (int/NULL)
[PK] SpecialtyID (int)
Name (string)
Description (string)
... такое, что если GroupID специализации равен нулю, это означает, что он применим ко всему отделу.
НоКонечно, вы не можете иметь пустое поле как часть PK.Так что это не нужно.
Также просто не удастся просто вытащить GroupID из PK, потому что тогда SpecialtyID должен быть уникальным для всего отдела, и мы уже создали идентификаторы, которыесделать это невозможным.
Невозможно создать «специальный» GroupID (например, «-1»), который означает «нет группы», поскольку ограничения FK потребуют от нас создания группы с идентификатором -1для каждого отдела.
... Итак ... что здесь делать правильно?Должен ли я сделать GUID для специальности и вытащить все эти FK из ПК?Очень хотелось бы избежать этого, если это возможно.
Любые идеи будут высоко оценены!