Jared Stroebele Ответов: 1

Проектная база данных для каскадного выпадающего списка без круговой ссылки


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

Например, я хочу добавить в базу данных новое оборудование. Оборудование имеет тип и подтип. Я выбираю тип, а затем выбираю подтип, который фильтруется по этому типу. Затем новое оборудование имеет ссылку на тип и подтип, которые также имеют отношение. Таким образом, я получаю треугольную/круговую ссылку (я бы включил изображение, но не могу понять этого).

В этой ситуации у людей обычно есть оборудование, ссылающееся только на подтип?
Это решило бы этот случай, поскольку подтипы имеют только один тип, но что, если это было отношение "многие ко многим" между типом и подтипом?
Что делать, если каскад имеет более двух вариантов, которые зависят друг от друга? (может быть, с маркой автомобиля, моделью, отделкой, двигателем)

Что я уже пробовал:

Используя C# и EF для создания базы данных, мои (упрощенные) объекты выглядят следующим образом:
public class Equipment
{
       [Key]
       public Guid EquipmentId { get; set; }
       public string Description{ get; set; }

       /***** Relationship and Navigation *****/
       public Guid EquipmentTypeId { get; set; }
       public EquipmentType EquiptmentType { get; set; }
       public Guid EquipmentSubTypeId { get; set; }
       public EquipmentSubType EquipmentSubType { get; set; }
}

public class EquipmentType
{
        [Key]
        public Guid EquipmentTypeId { get; set; }
        public string Description{ get; set; }

        /***** Relationship and Navigation *****/
        public ICollection Equipment { get; set; }
        public ICollection EquipmentSubType { get; set; }
}

public class EquipmentSubType
{
        [Key]
        public Guid EquipmentSubTypeId { get; set; }
        public string Description{ get; set; }

        /***** Relationship and Navigation *****/
        public Guid EquipmentTypeId { get; set; }
        public EquipmentType EquipmentType { get; set; }
        public ICollection Equipment { get; set; }
}

ZurdoDev

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

1 Ответов

Рейтинг:
2

Richard Deeming

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

Если подтип был необязательным или между подтипом и типом существовала связь "многие ко многим", то Вам, очевидно, нужно сохранить связь "оборудование/тип".

Единственная проблема, с которой вы столкнетесь, - это если вы попытаетесь включить каскадное удаление для всех трех отношений. SQL откажется создавать ограничение внешнего ключа, сообщив вам, что это вызовет циклы или несколько каскадных путей. Чтобы решить эту проблему, все, что вам нужно сделать, это отключить каскадное удаление в отношении оборудование/тип.

Entity Framework Fluent API-отношения-включение каскадного удаления[^]