对于具有大量记录的应用程序,在数据库中使用字典是否可以?

时间:2011-03-07 16:52:28

标签: django database-design django-models

我正在开发一款可以处理大量信息的应用程序,并且正在寻找创建模型的最佳方式。由于我从未使用处理过如此多记录的应用程序,因此数据库优化不是我所知道的很多主题,但在我看来,一个好的设计是一个很好的起点。

现在,我有一个供客户使用的表,一个产品表和一个产品客户表(因为我们为客户购买的每个产品分配代码)。由于我想跟踪余额,因此还有一个余额表。我的模型目前看起来像这样:

class Customer(models.Model):
    first_name = models.CharField(max_length=35)
    last_name = models.CharField(max_length=35)
    customer_ID= models.IntegerField(primary_key=True)
    phone = models.CharField(max_length=10, blank=True, null=True)

class Product(models.Model):
    product_ID = models.IntegerField(primary_key=True)
    product_code = models.CharField(max_length=25)
    invoice_date = models.DateField()
    employee = models.ForeignKey(Employee, null=True, blank=True)
    product_active = models.BooleanField()

class ProductCustomer(models.Model):
    prod = models.ForeignKey(Product, db_index=True)
    cust = models.ForeignKey(Customer, db_index=True)
    product_customer_ID = models.IntegerField(primary_key=True)
    [...]

class Balance(models.Model):
    product_customer = models.ForeignKey(ProductCustomer, db_index=True)
    balance = models.DecimalField(max_digits=10, decimal_places=2)
    batch = models.ForeignKey(Batch)
    [...]

该应用将返回客户的“历史记录”。如果该人在某个时候已经过期,然后他付了钱,那么应该退款等等。

我在想是否应该在Pax表上插入一个CharField,它会保存一个带有date:status的字典(状态可以计算并在我上传信息时添加到字典中)或者更多有效地在余额表上进行查询,或者是否有更好的解决方案可以实施。

由于有数以千计的产品和更多的客户,我们每周都会讨论大约400K的余额记录...我担心可以采取哪些措施来确保应用顺利运行。

1 个答案:

答案 0 :(得分:0)

如果我理解你的问题,你似乎在询问连接条件是否会对查询查询造成不合理的负担。在某种程度上,这取决于您的rdbms。我的建议是你使用PostgreSQL而不是MySQL,因为MySQL的innodb表针对主键查找进行了大量优化,这意味着必须遍历两个btree以便在连接上查找记录。另一方面,PostgreSQL允许对表进行物理扫描,这意味着外键查找通常会更快一些。

一般情况下,对于具有大量记录的应用程序,字典方法很好。问题通常来自于您查询的方式以及您在给定查询中提取的记录数。这比存储的记录数量要大得多,至少对于像PostgreSQL这样的数据库来说。