【问题标题】:Multiple db tables from a single Django model来自单个 Django 模型的多个数据库表
【发布时间】:2018-05-16 19:12:23
【问题描述】:

假设有某种汽车租赁/销售聚合器。它与许多服务提供商(向客户提供汽车)和客户本身合作。

Django 为这种系统做模型的方法是这样的:

class Vendor(models.Model):
    name = models.CharField()

class Car(models.Model):
    vendor = models.ForeignKey(Vendor,
                               blank=False,
                               null=False,
                               related_name='cars',
                               on_delete=models.CASCADE)
    license_plate = models.CharField(max_length=10, blank=False, null=False)

现在,我们将继续添加客户模型,可能是 m2m 字段通过表指向 Cars 以及租金或其他日期。即使所有汽车都在一张桌子上,所有供应商都只能访问他们的汽车,他们将为客户共享一张桌子,等等。

假设有几个供应商,比如十几个供应商,但每个供应商都有很多汽车 - 数以百万计,我的问题是:

尝试将 Cars 模型拆分为多个表会有什么好处(尽管 django 的原则是一张表 - 一个模型,也许在 DB 端有好处)?

我说的是按供应商拆分 - 即每个供应商都有自己的汽车桌。

我觉得如果每辆车都有一些描述,比如

desc = models.CharField(max_length=500, blank=True)

那么拆分可能会简化索引?不知道。如果有人能澄清这一点,将不胜感激。

无论如何,即使这样做没有真正的好处,假设我决定我真的需要这样做 - 将多个表粘合到一个 Django 模型。 这甚至可能吗?我的想法是尝试 SQLAlchemy,看看会发生什么。

我很想知道您将如何解决此类问题的任何见解或想法。或链接,如果有类似内容的文章。

【问题讨论】:

  • 不,通常如果模型被正确索引(通常是这样),数据库应该有效地处理这个问题。此外,数据库管理器可以决定将表拆分到多个磁盘、服务器等。您尝试在错误的层上解决问题。数据库负责对数据的快速访问等,而 django 负责将数据映射到 Python 对象的优雅方式,您负责对它执行有用的事情。
  • DB 表partitioning 可以是一个选项,它减少了搜索时间和表空间。但是设计有点棘手。

标签: python sql django


【解决方案1】:

数据库表分区需要良好的设计和适当的查询。有一个 python 应用程序Architect 可以与 django 一起使用。

Schemaless DB 是另一种处理海量数据的方法,众所周知 Uber 正在使用它。

【讨论】:

  • 建筑师似乎是我一直在寻找的东西。谢谢,伙计。
【解决方案2】:

取决于您的优化目标。如果您想快速访问一些独特的字段,例如汽车 VIN,索引会很有帮助。但是,一般来说,数据库会处理查询的性能优化。

如果您的表变得非常大(数十亿条记录),您可以查看 Instragram did with database sharding 的内容。这是一个很酷的例子,展示了如何跨多个数据库实例拆分表(使用 PostgreSQL,但同样适用于任何关系数据库)。

【讨论】:

  • 是的,我听说过分片,但它是另一种野兽。正如 Vinay 指出的那样,我说的是分区之类的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-28
  • 2014-09-17
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多