Как правильно реализовать модель хранения товара?
Помогите пожалуйста правильно составить модели БД для хранения товаров в ней. Имеется вот такая карточка товара:
Как реализовал модели сейчас. Есть общий класс товара:
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 шт):
Я думаю вам нужно ввести понятие характеристика. В модель товара нужно вынести все общее, что есть у любого товара 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;
}

