Должен ли я иметь таблицу для каждого типа продукта в базе данных
я очень запутался в этом, у меня есть три различных типа продуктов, сначала у меня есть физические продукты, которые просто являются художественными продуктами и партнерскими продуктами, и цифровые продукты, такие как курсы, книги, художественные картины, мой первый подход заключался в создании отдельной таблицы для каждого из них, как это:
class Category(models.Model):
name = models.CharField()
class ArtType(models.Model):
name = models.CharField()
class PhysicalArtProduct(modes.Model):
category = models.ForeignField(Category)
madeOf = models.ManyToManyField(AffeliateProduct)
artType = models.ForeignKey(ArtType)
........
class AffeliateProduct(models.Model):
........
class Course(models.Model):
artType = models.ForeignKey(ArtType)
.......
class Book(models.Model):
.......
Потому что PhyscialArtProduct связаны с AffeliateProduct, потому что PhysicalArtProduct сделаны из AffeliateProduct, поэтому мне пришлось добавить поле "многие ко многим" в PhysicalArtProduct
мой второй подход заключается в том, чтобы сделать одну таблицу Product и таблицу ProductType и построить отношения между самими продуктами и категорией и арттипом, добавив необходимые таблицы
какой подход мне следует использовать, любая помощь была бы очень признательна
Если курсы, книги, художественные картины, художественные продукты и партнерские продукты имеют разные поля, то для каждого из них нужна отдельная таблица.
Вероятно, у них также есть общие поля. Вы можете иметь таблицу product для всех общих полей, а другие таблицы будут иметь отношения один-к-одному с product. Именно такой дизайн я рекомендую:
class Product(models.Model):
name = models.CharField(blank=False, max_lenght=200)
class ArtType(models.Model):
product = models.OneToOneField(Product, null=True, blank=True, on_delete=models.CASCADE)
class AffeliateProduct(models.Model):
product = models.OneToOneField(Product, null=True, blank=True, on_delete=models.CASCADE)
class Course(models.Model):
product = models.OneToOneField(Product, null=True, blank=True, on_delete=models.CASCADE)
class Book(models.Model):
product = models.OneToOneField(Product, null=True, blank=True, on_delete=models.CASCADE)
Вы можете установить категорию как свойство внутри Product. Вам просто нужно проверить, какая связанная запись создана для текущего продукта, чтобы установить соответствующую категорию.
Вы можете использовать валидацию, чтобы убедиться, что один продукт имеет только одну связанную запись в возможных связанных таблицах.
Это в основном то, что я пытался сделать, надеюсь, это понятно, я не добавил много деталей, но надеюсь, что это даст достаточно информации для понимания
class Category(models.Model):
name = models.CharField()
class ArtType(models.Model):
name = models.CharField()
class Product(models.Model):
user = models.ForeignKey(User, models.PROTECT)
productId = models.UUIDField(default=uuid4, primary_key=True,
editable=False)
picture = models.ImageField()
discription = models.TextField(max_length=2000)
price = models.FloatField()
createdAt = models.DateTimeField(auto_now_add=True)
updatedAt = models.DateTimeField(auto_now=True))
cart_items = models.ManyToManyField(CartItem)
class PhysicalProduct(Product):
quantity = models.PositiveBigIntegerField()
colors = models.ManyToMany(Color)
title = models.CharField(max_length=100)
class Meta:
abstract = True
class AffeliateProduct(PhysicalProduct):
storeUrl = models.URLField()
class MstProduct(PhysicalProduct):
purposes = models.ManyToManyField(ProductPurpose, null = True, blank = True, related_name='products')
madeOf = models.ManyToManyField(AffeliateProduct, null = True, blank = True)
category = models.ForeignKey(Category, on_delete=models.PROTECT, related_name = "physical_products")
theme = models.ForeignKey(Theme, on_delete= models.SET_NULL, null = True, blank = True, related_name = 'physical_products')
art_type = models.ForeignKey(ArtType, on_delete=models.SET_NULL, null = True,blank = True)
class DigitalContentLanguage(models.Model):
languages = (
("ar","ar"),
("en","en")
)
language = models.CharField(max_length=2, choices=languages)
class Course(Product):
languages = models.ManyToMany(DigitalContentLanguage)
artType = models.ForeignKey(ArtType)
class CourseChapers(models.Model):
course = models.ForeignKey(Course)
..............
class Book(Product):
languages = models.ManyToMany(DigitalContentLanguage)
artType = models.ForeignKey(ArtType)
file = models.FileField()
ISBN = models.Charfield()
author = models.CharField()