Настройка отношений между таблицей пользователей и другими таблицами, такими как клиенты в базе данных SQL

#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 Да, рабочие комнаты являются пользователями приложений, потому что они войдут в приложение и получат спецификации дизайна, отправленные дизайнерами. Поэтому дизайнерам нужно много-много с рабочими комнатами и клиентами.