【问题标题】:Database Design: Similar offerings/services from different providers that have varying prices数据库设计:来自不同提供商的类似产品/服务,价格不同
【发布时间】:2015-09-09 23:28:10
【问题描述】:

我正在使用 Django/DRF 和 Postgres 为一个接受水疗、沙龙等预订的应用程序构建一个 API。

我希望有大量的提供商(水疗中心)提供类似服务的菜单,但价格不同。

Provider 1 Menu
---------------
Pedicure ($50)
Manicure ($40)
Thai Massage ($100)
Balinese Massage ($120)

Provider 2 Menu
---------------
Pedicure ($60)
Manicure ($50)
Head Massage ($120)

...

Provider 35000 Menu
---------------
Pedicure ($25)
Manicure ($25)
Balinese Massage ($90)

我正在尝试确定合适的模型来代表这种情况

这是我想出的:

class ServiceCategory(models.Model):
    Category = models.CharField(max_length=100, blank=True)

    def __unicode__(self):
        return self.Category


class Service(models.Model):
    Category = models.ForeignKey(ServiceCategory)
    Name = models.CharField(max_length=100, blank=True)

    def __unicode__(self):
        return self.Name


class Provider(models.Model):
    Manager = models.OneToOneField(User)
    Category = models.ForeignKey(ServiceCategory)
    Name = models.CharField(max_length=100, blank=True)

    def __unicode__(self):
        return self.Name


class MenuItem(models.Model):
    Provider = models.ForeignKey(Provider)
    Service = models.ForeignKey(Service)
    Price = models.DecimalField(max_digits=9, decimal_places=2, db_index=True)

    def __unicode__(self):
        return self.Provider.Name + "-" + self.Service.Name

此结构将如何处理以下类型的查询:

  1. 检索任何一个供应商的整个菜单以及价格
  2. 检索提供一类服务(例如按摩)的所有提供商(按地理位置过滤,按价格排序)的列表
  3. 检索提供指定服务(泰式按摩)的所有提供商的过滤列表

直觉上,我担心MenuItem 的表会很快变得庞大而缓慢,比如 1 到 400 万行,而 AJAX 和移动应用程序也可以通过 API 访问这些表。

有什么更好的方法来为性能建模?

可能是反规范化、PostgreSQL 设置、(mem) 缓存或拆分表?

【问题讨论】:

  • 我认为在这个早期阶段没有正确的答案。正确编入索引后,您可能看不到 MenuItem 表的任何性能问题。

标签: django database-design django-rest-framework database-schema


【解决方案1】:
  1. 检索任何一个供应商的整个菜单以及价格

    my_provider = Provider.objects.get(pk=my_provider_id)
    items = MenuItem.objects.filter(Provier=my_provider)
    for item in items:
        print item.Service,item.Price
    
  2. 检索提供一类服务(例如按摩)的所有提供商(按地理位置过滤,按价格排序)的列表

    像这样进行反向查找会很困难,但是您可以像这样进行相对高效的查找:

    my_ids = [i.Provider.pk for i in MenuItem.objects.filter(Service__ServiceCategory=my_category)]
    providers = Providers.objects.filter(geo_filter='do it here').filter(pk__in=my_ids)
    
  3. 检索提供指定服务(泰式按摩)的所有提供商的过滤列表

    my_providers = [i.Provider for i in MenuItem.objects.filter(Service=my_service)]
    

【讨论】:

  • 如果服务类别不是另一个类,而是服务类中带有选项的 CharField,它会有所帮助(还是让事情变得更糟?)?
  • 不分析它很难知道。首先设计您的应用,然后识别瓶颈,然后进行优化。
猜你喜欢
  • 2017-08-02
  • 1970-01-01
  • 1970-01-01
  • 2021-11-10
  • 1970-01-01
  • 2013-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多