我正在开发一款可以处理大量信息的应用程序,并且正在寻找创建模型的最佳方式。由于我从未使用处理过如此多记录的应用程序,因此数据库优化不是我所知道的很多主题,但在我看来,一个好的设计是一个很好的起点。
现在,我有一个供客户使用的表,一个产品表和一个产品客户表(因为我们为客户购买的每个产品分配代码)。由于我想跟踪余额,因此还有一个余额表。我的模型目前看起来像这样:
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的余额记录...我担心可以采取哪些措施来确保应用顺利运行。
答案 0 :(得分:0)
如果我理解你的问题,你似乎在询问连接条件是否会对查询查询造成不合理的负担。在某种程度上,这取决于您的rdbms。我的建议是你使用PostgreSQL而不是MySQL,因为MySQL的innodb表针对主键查找进行了大量优化,这意味着必须遍历两个btree以便在连接上查找记录。另一方面,PostgreSQL允许对表进行物理扫描,这意味着外键查找通常会更快一些。
一般情况下,对于具有大量记录的应用程序,字典方法很好。问题通常来自于您查询的方式以及您在给定查询中提取的记录数。这比存储的记录数量要大得多,至少对于像PostgreSQL这样的数据库来说。