2009-09-15 41 views
0

我不知道我100%明白数据库的作用。如果我只是有一些误解,请指出。Django的数据创建和提交

比方说,我有一个函数,想要在数据库中创建100个具有100,000个条目的新条目。

当这100个条目获得创建并且在创建最后一个条目后进行提交时,似乎要快得多。

现在,如果这100个条目是由不同的用户创建的,那么只有在创建了100个条目后才有提交的简单方法吗?

编辑: 我应该写一些缓冲区?

回答

2

数据库针对基于集合的操作进行了优化,因此是的,一次插入100个记录的速度会快于一次。但是,当您谈论用户每次输入记录时,您不希望在任何我能想到的情况下将它们组合在一起。为什么?

首先,如果有一个不良记录,其他人将失败。这将使99个用户中有100个(实际上是100个),但其中一个不会因为开始时输入错误数据而导致系统故障。 其次,用户输入后不会立即看到记录。在输入数据之前,他们将无法对这些记录做进一步处理,例如将数据输入相关表格。有这样的延迟会让用户胡思乱想。如果用户通过电话向客户输入数据,他们会特别胡思乱想(我在一个呼叫中心工作,商业产品速度非常慢,并且相信我知道用户曾经得到过多么不安)! 三,用户将会继续其他事情,并且不会意识到他们的数据因为不良信息而被拒绝,而不是一件好事。 您要等多久才能获得您设置的记录数? 5秒钟,十分钟? 如果由于某种原因,网络连接在此期间丢失,会发生什么情况,用户会丢失他们输入的数据。

2

可能能够破解这样的事情一起,但你真的应该没有,因为它击毁你的数据的完整性,这是使用交易的全部意义。

在您提出的解决方案中,批次中任何插入的问题都会导致来自完全不同用户的所有其他(可能完全有效)插入失败。另外,用户将无法看到他们刚刚尝试插入的数据,因为系统在等待批量填满之前等待插入。

P.S.这是一个quick intro to transaction processing

1

我想你确实有一种误解。这听起来像是你将数据库看作只是某种“长期”内存的东西。这是一个糟糕的概念;该数据库只有你的应用程序具有的内存。即使这不是真的,最好假装它是。

要更深入一点,你的应用有:

  • 的作用域存储器:变量定义视图功能内,例如。当流量离开功能时,这些全部被破坏。
  • 全局变量:在代码的最外面部分定义的变量。除了配置常量之外,不要将它们用于任何状态。重要的是你应该依赖任何动态行为。否则,你将不得不对付并发分叉的进程(取决于服务器网关),这些进程不知道彼此。只是不要这样做。
  • 一个缓存方案,如果你选择实现一个。这在django中完全是可选的,并且有很多方法可以做到这一点。但是,通常使用一些方案来确保即使缓存崩溃,数据库也能准确反映数据的当前状态。
  • 您的本地文件系统。从设计的角度来看,大多数利用这种方式的方法要么像上面的缓存系统,要么笨拙而脆弱。从性能角度来看,它可能与数据库一样缓慢。
  • 您的数据库。

因此,您会发现除了数据库之外,没有太多的地方可以放置数据。