在什么时候值得使用数据库?

时间:2010-04-15 20:38:18

标签: c++ sql database qt user-interface

我有一个与数据库有关的问题,以及在什么时候值得深入研究。我主要是一名嵌入式工程师,但我正在编写一个使用Qt与我们的控制器连接的应用程序。

我们有一个奇怪的地方,我们有足够的数据可以实现数据库(大约700多个项目并且不断增长)来管理一切,但我不确定现在是否值得花时间处理。使用excel生成的文件和解析后的文件实现GUI没有问题,但即使使用VBA脚本也很难跟踪。我一直在使用Microsoft Access将我们的数据转换为更易于管理的应用程序端,这似乎运行良好。如果能够解决这个问题,那么我只需要使用SQL数据库并使用Qt库来访问和修改它,这只是一步(或几步)。

我没有太多管理此级别数据的经验,我很好奇可能是解决此问题的最佳方法。那么在这种情况下使用数据库有哪些真正的好处呢?我意识到这可能是非常特定于应用程序的,但是关于如何跨越嵌入式/应用程序编程线的一些一般性想法和建议将会有所帮助。

这不是将数据库放在嵌入式项目中。它也不是通常使用较大数据库的业务类型应用程序。我正在为桌面上的单个用户设计一个GUI,以便与微控制器连接,以进行监控和配置。


我决定选择SQLite。你可以用我在第一次启动这个项目时没有考虑的数据做一些非常有趣的事情。

13 个答案:

答案 0 :(得分:38)

在以下情况下,数据库是值得的:

  1. 您的应用程序演变为一些 数据驱动执行的形式。
  2. 你花时间设计和 开发外部数据存储 结构。
  3. 在应用程序之间共享数据或 组织(包括个人 人)
  4. 数据不再短暂 简单。
  5. 数据复制
  6. 向数据驱动执行的演变
    当数据发生变化但执行不是时,这是数据驱动程序的标志,或程序的某些部分是数据驱动的。一组配置选项是数据驱动功能的标志,但整个应用程序可能不是数据驱动的。无论如何,数据库可以帮助管理数据。 (数据库库或应用程序不一定像Oracle一样庞大,但可以像SQLite一样精益求精)。

    设计&外部数据结构的发展
    Stack Overflow 发布有关序列化或转换树和列表以使用文件的问题,这是一个很好的迹象,表明您的程序已经毕业使用数据库。此外,如果您花费任何时间设计算法来将数据存储在文件中,或者在文件中设计数据是研究数据库使用情况的好时机。

    分享数据
    无论您的应用程序是与其他应用程序,其他组织还是其他人共享数据,数据库都可以提供帮助。通过使用数据库,可以更轻松地实现数据一致性。问题调查的一个重要问题是团队没有使用相同的数据。客户可以使用一组数据;验证团队使用另一组数据进行开发和开发。数据库使数据的版本化更容易,并允许实体使用相同的数据。

    复杂数据
    程序开始使用小型硬编码数据表。这演变为使用带有地图,树和列表的动态数据。有时,数据从简单的两列扩展到8或更多。数据库理论和数据库可以减轻组织数据的复杂性。让数据库担心管理数据并释放您的应用程序和开发时间。毕竟,如何管理数据并不像数据的质量和可访问性那么重要。

    数据重复
    通常,当数据增长时,重复数据的吸引力越来越大。数据库和数据库理论可以最大限度地减少数据的重复。可以将数据库配置为警告不要重复。

    转向使用数据库有许多因素需要考虑。一些包括但不限于:数据复杂性,数据重复(包括部分数据),项目截止日期,开发成本和许可问题。如果您的程序可以使用数据库更有效地运行,那么就这样做。数据库还可以节省开发时间(和金钱)。您和您的应用程序可以执行的其他任务比管理数据还要多。将数据管理留给专家。

答案 1 :(得分:8)

您所描述的内容听起来并不像典型的商业应用程序,并且此处发布的许多答案都假设这是您正在讨论的应用程序,所以让我提供一个不同的视角。

您是否使用700个项目的数据库将在很大程度上取决于数据的性质。

我想说,在这种规模下,大约90%的时间,您将受益于像SQLite这样的轻量级数据库,前提是:

  1. 数据可能会比您描述的数据大得多,
  2. 数据可能由多个用户共享,
  3. 您可能需要针对数据运行查询(我认为您现在没有这样做),
  4. 数据可以很容易地以表格形式描述。
  5. 另外10%的时间,您的数据将是高度结构化的,分层的,基于对象的,并且不能完全适合数据库或Excel表的表模型。如果是这种情况,请考虑使用XML文件。

    我知道开发人员本能地喜欢在这样的问题上抛出数据库,但是如果您当前正在使用Excel数据来设计用户界面(或显示配置设置),而不是显示客户记录,那么XML可能更适合。 XML比Excel或数据库表更具表现力,并且可以使用简单的文本编辑器轻松操作。

    C ++的XML解析器和数据绑定器是easy to find

答案 2 :(得分:4)

我建议您在应用中引入数据库,您的应用程序将获得灵活性,并且将来更容易维护和改进新功能。
我将从基于轻量级文件的数据库开始,如Sqlite 有了精心设计的数据库,您将拥有:

  1. 减少数据冗余
  2. 更高的数据完整性
  3. 改善数据安全性
  4. 最后但并非最不重要的是,使用数据库将使您免于 Excel导入/更新/导出地狱

答案 3 :(得分:3)

使用数据库的原因:

  • 并发写道。在数据库中实现并发很容易
  • 轻松查询。 SQL查询往往比过程代码更简洁,以搜索数据。 UPDATE,INSERT INTO也可以用很少的代码做很多事情
  • 完整性。约束非常容易定义,并且无需编写代码即可实施。如果你有一个非null约束,你可以放心,该值不会为null,不需要在任何地方写入检查。如果您有外键约束,则不会有“悬空引用”。
  • 在大型数据集上的表现。索引很容易添加到SQL数据库

不使用数据库的原因:

  • 它往往是一个额外的依赖(尽管存在非常轻量级的数据库 - 例如我喜欢H2 for Java)
  • 数据不太适合关系模式。基本上是键/值映射的东西。 XML(尽管数据库通常支持XPath等)。
  • 有时文件更方便。它们可以使用纯文本编辑器进行差异化,合并,编辑等。有时,电子表格可能更实用(您不必构建编辑器 - 您可以使用电子表格程序)
  • 您的数据已经存在于其他地方

答案 4 :(得分:2)

当您拥有大量数据时,您不确定将来如何利用这些数据。

例如,您可能希望在嵌入式应用程序中添加一个SQLite数据库,该数据库需要注册您不确定将如何使用的统计信息。稍后,您将在中央服务器上运行的较大数据库中发送完整的数据库,并使用请求轻松利用这些数据。

事实上,如果您的应用程序的目的是“收集数据”,那么必须拥有数据库。

答案 5 :(得分:2)

我看到数据库很好地满足了一些要求:

1)。即席查询。找到符合条件Y

的所有{X}

2)。具有可以从规范化中受益的结构的数据 - 将常见值分解为单独的“表”。您可以通过这种方式节省空间并减少不一致的可能性。一旦你完成了这个,那些即席查询开始真正有用。

3)。大数据量。专业数据库非常善于充分利用资源,巧妙的查询选择和分页策略。试着自己写这些东西是一个真正的挑战。

你显然不需要最后一个,但其他两个,也许适用于你。

答案 6 :(得分:2)

不要忘记,根据您的要求,相应的数据库可能会有很大不同(如果您的要求非常简单,请不要忘记文本文件可以用作数据库 - 例如,配置文件是只是一种特定的数据库)。这些参数可能是:

  • 记录数
  • 数据项的大小
  • 数据库是否需要与其他设备共享?同时?
  • 各种数据之间的关系有多复杂
  • 是只读数据库(在构建时创建而不是更改,例如)?
  • 数据库是否需要同时由多个实体更新?
  • 您是否需要支持复杂查询?

对于包含700个条目的数据库,从文本文件加载的内存中排序数组可能是合适的。但我也可以看到需要嵌入式SQL数据库,或者让控制器通过网络连接从数据库请求数据,具体取决于各种要求(和资源限制)。

答案 7 :(得分:2)

数据库没有特定的价值。相反,我通常会问以下问题:

  • 应用程序使用/创建的数据量是否在增长?
  • 此数据增长的上限是否未知(或不清楚)?
  • 应用程序是否需要聚合或过滤此数据?
  • 现在可能不会显而易见的数据未来会有用吗?
  • 数据检索和/或存储的性能是否重要?
  • 共享数据的应用程序的多个用户是否存在(或可能存在)?

如果我对大多数问题回答“是”,我几乎总是选择一个数据库(而不是其他选项,如XML / ini / CSV / Excel /文本文件或文件系统)。

此外,如果应用程序将有许多可以同时访问数据的用户,我将倾向于使用完整的数据库服务器(MySQL,SQl Server,Oracle等)。

但是,通常在单个用户(或小并发)情况下,SQLite等本地数据库不能被打败以实现可移植性和易部署性。

答案 8 :(得分:1)

添加否定:由于非确定性延迟,不适合实时处理。但是,查找和设置操作参数(例如在启动期间)将非常充足。我不会将数据库访问放在关键时间路径上。

答案 9 :(得分:1)

如果在一个或两个表中有几千行要在单个用户应用程序中处理(对于嵌入点),则不需要数据库。

如果它适用于多个用户(并发访问,锁定)或需要事务,您肯定应该考虑使用数据库。 处理规范化表中的复杂数据结构并维护整数或大量数据将是您应该使用数据库的另一个指示。

答案 10 :(得分:1)

听起来您的应用程序正在台式计算机上运行,​​只是简单地与嵌入式设备进行通信。

因此使用数据库更加可行。在嵌入式平台上使用一个是一个更复杂的问题。

在桌面上,当需要不断存储新信息并需要以关系方式提取信息时,我会使用数据库。我不使用数据库的是存储静态信息,我在加载时读取的信息就是这样。例外情况是应用程序有许多用户,并且需要按用户存储此信息。

听起来像是你从嵌入式设备收集信息,以某种方式存储它,然后再用它来通过GUI显示。

这是使用数据库的一个很好的案例,特别是如果您可以构建系统,以便有一个数据收集守护程序来管理与嵌入式设备的持续通信。然后,此应用程序可以将数据写入数据库。启动GUI时,它可以提取数据以供显示。

如果您需要显示不同的视图,使用数据库还可以简化您的GUI开发,例如“显示两个日期之间的所有条目”。使用数据库,您只需要使用正确的SQL查询来显示正确的值,GUI将显示返回的内容,允许您从GUI中分离出大量“业务逻辑”代码。

答案 11 :(得分:1)

我们也面临着类似的情况。我们有来自不同测试设置的数据集,目前正在将其转储到Excel工作表中,使用Perl或VBA进行处理。

我们发现这种方法有很多问题:

我。使用Excel工作表管理数据非常麻烦。一段时间后,你有很多excel表,没有简单的方法从中检索所需的数据。

II。人们开始来回发送excel表格以通过电子邮件发表评论和评论。电子邮件成为管理与数据相关的评论的主要模式。这些评论在以后丢失,无法将其检索回来。

III。

表示创建了多个文件副本,一个副本中的更改未反映在另一个副本中 - 没有版本控制。

出于同样的原因,我们决定转向基于数据库的解决方案,目前正在努力解决这个问题。让我总结一下我们要做的事情:

我。数据库位于中央服务器中,可由PC在所有测试设置中访问。

II。生成后,所有数据都会立即进入临时位置(文件中的本地硬盘)。从文件中,它被后台运行的进程推送到数据库中(因此,即使存在网络问题,本地文件系统中也会出现数据)。

III。我们有一个基于Web的应用程序,允许用户以他们想要的格式登录和访问数据。门户网站将允许他们添加评论,生成不同类型的报告,在审核后与其他用户共享。它还可以将数据导出到Excel工作表中,以防您需要随身携带。

让我们知道这是否可以更好地实施。

答案 12 :(得分:-2)

“在什么时候值得使用数据库?”

如果您有数据需要管理?