和的原因对数据库

时间:2010-04-12 14:11:36

标签: rdbms

我与一位同事讨论了我正在编写的程序的架构,我想要更多的意见。

情况:

  • 本程序应近实时更新(+/- 1分钟)。
  • 它涉及物体在坐标系上的移动。
  • 有些事件会定期发生(即创建对象)。
  • 移动可以随时通过用户输入进行更改。

我的解决方案是:

  • 构建一个连续运行并在内部存储数据的服务器。
  • 服务器定期转储程序状态,以防止电源故障和/或崩溃。

他认为该程序需要一个数据库,我应该使用cronjobs来更新数据。我可以通过存储起点,终点和速度来存储运动信息,并通过计算方向和速度来更新cronjob中的位置(并计算与其他物体的碰撞)。

他的理由:

  • 需要更多CPU和记忆因为它不断运行。
  • Powerfailures / Crashes可能会破坏数据。
  • 数据库更快。

我反对这一点的理由主要是:

  • 不太精确,因为事件只能在完整的时间发生(尽管不会那么糟糕)。
  • 每次从关系数据到对象的运行都需要(可能代价很高)转换数据。
  • RDBMS是针对特定问题的通用解决方案,因此专业解决方案应该更有效。
  • Powerfailures(或其他崩溃)可能会使数据处于未定义状态,只有部分更新的数据,除非采取(可能是代价高昂的)预防措施(如交易)。

您对此有何看法?
您可以为任何一方添加哪些参数?

3 个答案:

答案 0 :(得分:2)

数据库速度不快。多么愚蠢......数据库如何比编写自定义数据结构并将其存储在内存中更快?数据库是用于将数据保存到磁盘的通用工具,因此您无需编写所有代码来自行执行此操作。因为它们必须满足众多不同(有时是不一致的)业务功能(持久性(持久性),事务完整性,缓存,关系完整性,原子性等等)的需求,并以保护应用程序开发人员的方式执行不得不担心它,根据定义它会变慢。但这并不意味着他的结论是错误的。

他的其他反对意见可以通过编写代码来解决这个问题来解决......但是你看到了它的发展方向......在某些时候,编写自定义代码来解决问题的开发工作对于您的应用程序来说重要的是超过仅仅使用数据库的性能 - 这已经完成了所有开箱即用的功能......这些问题中有多少是重要的?你知道如何编写解决它们所需的代码吗?

答案 1 :(得分:1)

根据您在此处描述的内容,我会说您的解决方案似乎确实是更好的选择。你说它每分钟运行一次,但运行需要多长时间?如果只有几秒钟,那么对关系数据的转换可能是无关紧要的,就像任何其他开销一样。大部分时间可能需要30秒。这再次假设程序非常小。

但是,如果它更大,并且假设它会变大,那么进行直接转储是一种更好的方法。您可能不希望每次运行都进行完全转储,但这取决于您,只需记住它可能会占用大量空间(如果您使用数据库也是如此)。

如果要转储状态,则需要使用某种冗余系统以及准交易。如果最新版本出现问题,您可能希望存储多个副本。比如说,当你存储时,电源就会耗尽,除了这个半写之外你没有备份。交易,你需​​要告诉你文件已经完全写好了,所以如果出现问题,你总能说出最近成功保存的内容。

哦,并且因为他经常运行它的论点:如果你把它设置为cronjob,甚至是自封闭的睡眠声明或类似的,它不会在它没有运行时使用任何CPU时间,相同的数量如果您正在使用RDBMS,那就是它。

如果您直接写入磁盘,那么这将是比数据库更快的方法,并且检索速度更快,因为正如您所指出的那样,没有开销。

总结:如果您有大量空闲的处理器时间或历史记录,数据库是一个好主意,但如果资源是合法的问题,那么它可能会成为过多的开销,并且采取预防措施的转储更好。

答案 2 :(得分:0)

mySQL现在可以为空间数据建模。

http://dev.mysql.com/doc/refman/4.1/en/gis-introduction.html

http://dev.mysql.com/doc/refman/5.1/en/spatial-extensions.html

您可以使用数据库来跟踪世界位置,用户位置,项目位置等。