重写Web应用程序的数据库设计

Chr*_*ris 12 database-design data-modeling

我们为客户提供的许多LOB应用程序具有营销/促销性质(抽奖活动,活动注册等).大多数应用程序虽然非常简单,但对数据库要求很高.想象一下,"注册"型网站作为在超级碗期间播出的商业广告的支持,例如(是的,我们有几个).

虽然我们已经非常善于优化我们的Web应用程序代码,但数据库始终是一个问题,尽管应用程序相对简单.流程通常类似于:

  1. 从数据库读取以检测现有记录
  2. 如果记录是新的,写入数据库

在许多情况下,这是我们的应用程序需要执行的所有数据访问.但是,鉴于它是应用程序的唯一目的,因此对这个简单的过程进行大大优化非常重要.

出于这个问题的目的,我们有一台服务器为数据文件运行raid 5磁盘阵列,为日志运行另一个raid 5阵列.此时,操作系统是Windows 2003标准32位,服务器有4 GB内存.一些应用使用SQL 2005标准,而其他应用使用MySQL 5.1.我非常清楚这里可以进行某些操作系统和硬件优化,但我希望首先从软件方面解决我的需求.广泛的分析告诉我们,磁盘IO通常是主要的瓶颈.

说了这么多,并且知道缓存不会有多大帮助,因为大多数读取都是唯一的并返回非常少的数据(通常只是指示记录是否存在),我正在考虑进入一个领域. -memory数据库作为真实数据库的写缓存层.这似乎是一个很好的选择,因为我们的大部分高流量流量本质上是零星的,并且不会持续数小时.此外,在大多数情况下,由于服务器崩溃可能会丢失几分钟的数据.

在最简单的形式中,我会修改一个典型的注册应用程序来执行以下操作:

  1. 查询磁盘DB和内存DB以查找现有记录
  2. 如果不是,则将数据写入内存DB并返回
  3. 定期将内存DB刷新到磁盘DB

我的问题是:这个中间内存数据库有哪些选择?我已经尝试了内存中的哈希表,数据表等,但我正在寻找其他选项,甚至是针对完全不同的方法的建议.

Rya*_*ner 8

如果您不需要实时知道是否存在现有记录(即记录进入该记录很重要,但您不需要报告该记录是新的还是现有的),您可以以一种允许极快写入时间的方式构建数据库,而不需要内存数据库,如果服务器出现故障或工作进程重新启动,这会带来很多潜在的问题.

在数据库中为每个与此写入流量相关的表创建两个表.一个表应该是您的"实时"表,并且应该尽可能地进行写入优化(即没有索引,除非移动到读取表,否则永远不会读取).您的另一个表应该是您的读优化表 - 根据任何报告考虑因素编制索引等.

无论何时写入实时表,都要忽略与记录是新的还是现有的任何关系,或者除了尽可能快地将数据放入表中并离开数据库之外的任何事情.设置一个计划作业,将记录从活动表移动到读取优化表中,并担心匹配现有记录.理想情况下,这将在非高峰时段完成,但是否则您可能需要考虑第三个临时表,以便在任何时候都不会在实时表上发生争用.

  • 如果来自实时表的数据应该可以相对快速地读取怎么办?(即不能等到预定的作业将新数据传输到读取表) (3认同)

sri*_*lla 6

接受新概念"一切都是消息,数据库是备份".当你有东西要存储时,创建一条消息并使用XMPP将其发送到黑盒子(如eJabberD).让blackbox按照自己的计划更新您的数据库.这就是Twitter这样的网站的运作方式.

看看这张幻灯片:http: //www.slideshare.net/kellan/beyond-rest