Как правильно реализовать модель хранения товара?

Помогите пожалуйста правильно составить модели БД для хранения товаров в ней. Имеется вот такая карточка товара:

введите сюда описание изображения

Как реализовал модели сейчас. Есть общий класс товара:

public class Product
{
    public int ID { get; set; }
    [Required]
    public string Name { get; set; }
    [Required]
    public string Description { get; set; }
    public List<ProductProp> ProductProps { get; set; }


    //public int CategoryId { get; set; }
    public Category Category { get; set; }

}

У модели товара есть свойства, которые как раз и описывают размер пиццы и цена за нужный размер

public class ProductProp
{
    public int ID { get; set; }
    [Required]
    public string Size { get; set; }
    [Required]
    public int Price { get; set; }

}

Есть модель категории:

 public class Category
{
    public int ID { get; set; }

    [Required]
    public string CategoryName { get; set; }
    public List<Product> Products { get; set; }
}

Это все хорошо работает если только в товарах есть пицца, но добавив скажем напитки либо соусы у которых нет такого понятия как "высота теста" и все у меня валится. Пример других карточек товаров: введите сюда описание изображения

введите сюда описание изображения

Как все же правильно хранить подобное? В голову приходит идея с наследованием: есть общее описание товара, есть картинка, описание и ID, потом уже создавать класс скажем для Пиццы или Напитков и конкретно в них описывать дополнительные свойства товара, но на сколько такое решение правильное, может есть что то другое? У кого был подобный опыт, помогите пожалуйста.


Ответы (1 шт):

Автор решения: Pavel Popov

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

И создать класс характеристики, в нем будут поля: тип характеристики(enum вес,размер и т.п.) и значение характеристики. Советую сделать базовый абстрактный класс(в нем будет только свойство типа характеристики), а от него создать характеристики для конкретных типов например размеры будут в int, типы теста - некое перечисление и т.п.

В модели товара разместите коллекцию и указывайте там список всех уникальных характеристик для товара. Таким образом вы получите гибкую настройку характеристик.

 public abstract class SpecificationBase
    {
       public SpecificationType Type {get;set;}
    }
     
    public  class SizeSpecification:SpecificationBase
    {
       public int Value{get;set;}
    }
    
    public class Product
    {
        public int ID { get; set; }
        [Required]
        public string Name { get; set; }
        [Required]
        public string Description { get; set; }
        public List<ProductProp> ProductProps { get; set; }
    
    
        //public int CategoryId { get; set; }
        public Category Category { get; set; }
    
        public IEnumerable<SpecificationBase> Specifications{get;set;}
    }

Можно еще например в базовый класс сразу добавить свойство значения через дженерик, но это удбно только для характеристик с одним значением

public abstract class SpecificationBase<T>
{
   public abstract SpecificationType Type {get;}
   public T Value {get;set;}
}
public class SizeSpecification:SpecificationBase<int>
{
    public override SpecificationType Type =>SpecificationType.Size;
}
→ Ссылка