#c# #sql #database #database-design #entity-framework-core
Вопрос:
Я использую .NET 5 и ядро Entity Framework, но это скорее вопрос схемы базы данных. Я знаю, как наладить отношения, но я не уверен, что это лучший подход.
У меня есть таблица под названием «Пользователи приложений», которую я использую в основном для аутентификации личности. Таким образом, у всех пользователей приложения будет запись в этой таблице. У меня также есть следующие таблицы: Дизайнеры, Клиенты и Рабочие комнаты. Все дизайнеры, клиенты и рабочие комнаты являются пользователями приложений и должны иметь запись в пользователях приложений. Сначала я установил индивидуальные отношения между пользователями и дизайнерами, пользователями и клиентами и т. Д.
Проблема в том, что мне также нужны отношения «многие ко многим» между Дизайнерами и Клиентами, Дизайнерами и Рабочими комнатами. Это приводит к ошибке: «может привести к циклам или нескольким каскадным путям.»Я, вероятно, мог бы определить поведение каскада и обойти это, но я не уверен, что это лучший подход.
Это моя модель пользователей за вычетом нерелевантных свойств:
public class AppUserModel
{
[Key]
public int AppUserId { get; set; }
public string UserName { get; set; }
public int? DesignerId { get; set; }
public int? ClientId { get; set; }
public int? WorkroomId { get; set; }
...
}
У меня больше нет отношений «один к одному», вместо этого у меня просто есть обнуляемые свойства int для идентификаторов дизайнеров, клиентов и рабочих комнат. Поэтому я бы проверил наличие null в этих свойствах, а затем получил запись конструктора, например, по идентификатору. Так что теперь между этими таблицами нет никакой связи.
У меня все еще есть отношения «многие ко многим» между Дизайнерами и Клиентами, Дизайнерами и рабочими комнатами. Это необходимо, потому что у клиентов и рабочих комнат может быть несколько дизайнеров.
Я полагаю, это сработает, но я не эксперт по базам данных и не знаю, есть ли лучший способ справиться с этим. Я был бы признателен за любое руководство.
Необходимы ли отношения «один к одному» для таблиц пользователей приложений, дизайнеров и т. Д.? Или будут ли обнуляемые значения достаточно хороши?
Комментарии:
1. Вам нужно быть более описательным: какие отношения «много-много» между этими тремя должны представлять?
2. Вы уже проверили таблицу по иерархическому подходу? При таком подходе вы могли бы сохранить всех дизайнеров, клиентов, рабочие комнаты в одной таблице, дифференцированной с помощью дискриминатора. Его реализация осуществляется с помощью общего базового типа. Тогда вы могли бы позволить базовому типу
AppUserModel
иметь множество отношений между собой и другими пользователями. Взаимосвязь «многие ко многим» будет решена самим ядром entity framework и приведет к созданию новой сводной таблицы. Пусть имя будет AppUserAppUsers, потому что оно связано само с собой.3. Я выбрал другой подход в начале 2.0 и 3.1. Я создал таблицу, которая в вашей ситуации называлась бы ClientWorkroomDesigners. Что касается ваших трех разных типов, вам понадобится перечисление, чтобы различать ваши типы. Кроме того, я создал таблицы ClientInfo, WorkroomInfo, DesignerInfo для получения дополнительной информации и установил связь «один к одному» между этими пользователями приложений. Проблема заключалась в том, что 2 из 3 навигационных свойств имеют значение null. Несмотря на это, я создал таблицу отношений, которая позволила мне создавать отношения между этими дизайнерами клиентской комнаты
4. Спасибо. Мне просто было интересно, может ли стол иметь много-ко-многим сам по себе. Я попробую использовать подход с таблицей для каждой иерархии.
5. Вам не нужно много ко многим. Возможно, вам захочется выполнить запрос и получить много, но связь в базе данных одна к одной.
Ответ №1:
На основе следующих:
- Все дизайнеры и клиенты являются пользователями приложений.
- Дизайнер и Клиент могут быть связаны с Рабочей комнатой.
- Любой дизайнер может быть связан с любым Клиентом
Что-то подобное может сделать:
Если между пользователем приложения и дизайнером, Клиентом или записью в рабочей комнате существуют отношения «один к одному», мы изменим эти отношения на:
Это гарантирует, что каждая запись Дизайнера, Клиента и Рабочей комнаты имеет назначенную запись пользователя приложения, позволяя при этом любое сочетание записей Дизайнера, Клиента и Рабочей комнаты (предполагается, что каждый дизайнер работает с Клиентом и в Рабочей комнате).
Таблица WorkroomUsage
отношений позволяет нам иметь множество отношений между Клиентами, Дизайнерами и Рабочими комнатами, просто имея больше записей.
Например: 2 дизайнера (идентификаторы №1 и №2), 1 Клиент (идентификатор №1), 1 Рабочая комната (идентификатор № 1) будут:
Дизайнер № 1, Клиент №1, Рабочая комната № 1
Дизайнер №2, Клиент №1, Рабочая комната № 1
Комментарии:
1. OC написал, что рабочие комнаты также являются пользователями приложений
All designers, clients, and workrooms are app users and should have a record in AppUsers.
, и я мог бы понять, что между дизайнерами и клиентами существуют отношения. А также отношения между дизайнерами и рабочими комнатами. Потому что я предполагаю, что дизайнер может выбирать из разных рабочих комнат, и клиенты не привязаны к рабочим комнатам. Это как говорит учительtoday we are in this room
. Клиенты следуют за дизайнером, а не за комнатой. Я прав?2. Если Дизайнер и Клиент должны использовать Рабочую комнату, то таблица
WorkroomUsage
отношений остается в силе. Если Рабочая комната необязательна, вам понадобится отдельная таблица для описания этих отношений. Лично я не думаю, что у рабочей комнаты должны быть отношения с пользователем приложения, если это не участник приложения, а просто ресурс.3. Извините — я имел в виду следующее: «Если рабочая комната необязательна, вам понадобится либо отдельный стол, чтобы охватить эти отношения, либо разрешить
workroomId
находитьсяnull
в таблице.4. Спасибо. Все это очень полезно. Я настроил шаблон таблицы по иерархии в соответствии с этой документацией: docs.microsoft.com/en-us/ef/core/modeling/inheritance Да, рабочие комнаты являются пользователями приложений, потому что они войдут в приложение и получат спецификации дизайна, отправленные дизайнерами. Поэтому дизайнерам нужно много-много с рабочими комнатами и клиентами.