3

我使用 Apache、PHP 和 MySQL 进行 Web 开发和本地应用程序。在过去的几年里,我一直在慢慢学习 C++,并想在今年夏天构建一个应用程序。具体来说,我想制作一个“图书馆”应用程序,我可以在其中存储有关我拥有的书籍、CD 和记录的信息。我知道存在这种类型的应用程序,但我想学习 C++,这似乎是一个很好的方法。

这里有几个问题:

  1. 是否可以创建一个不需要数据库来存储数据的独立应用程序?

  2. 如果上面#1 的答案是“是”,那么对于可能需要管理大量数据的应用程序执行此操作是否是个好主意?

  3. 您会推荐哪些数据存储选项用于 C++ 应用程序?

谢谢!

更新 好吧,对此有很多很好的答案。这是一个很棒的网站,有很多贡献者。事实证明,我现在可能真的不需要走 C++ 路线。我现在意识到我最感兴趣的是编写一个可以用作“库”组织系统的应用程序,而不是我想要追求 C++。感谢大家的回答!

4

6 回答 6

6

是否可以创建一个不需要数据库来存储数据的独立应用程序?

是的,您可以使用某种自定义文件格式来存储数据。

如果上面#1 的答案是“是”,那么对于可能需要管理大量数据的应用程序执行此操作是否是个好主意?

这不是一个好主意,除非您真的想了解如何将数据存储在结构化文件中。

您会推荐哪些数据存储选项用于 C++ 应用程序?

我会看看SQLite。它是一个数据库,但它不需要单独的引擎。

于 2010-05-22T16:06:20.830 回答
2

如果您不想使用数据库,您可能希望将数据保存到一个文件(或者可能不止一个)。如果是这样,问题可能是:哪种文件格式最好?答案取决于多种因素:

1)访问速度快,体积小,易于解析?答案是“二进制数据”。只需使用fwrite直接将数据按原样写入输出文件即可。有两个缺点:文件不是人类可读的,维护不同的版本很麻烦。如果您读取的数据不完全符合您的预期,您很快就会遇到麻烦。

2)人类可读且易于维护?这就是 XML 的用途。有现成的解析器,例如 tinyXML,它们是用于将数据写入文件的出色工具。缺点是编写加载/保存例程需要更多时间(很多情况下)。

3) 为您完成这项工作的图书馆。MFC 提供了 CArchive 类,但还有其他可能更好的工具来执行此操作。

于 2010-05-22T16:08:08.750 回答
1
  1. 是的。
  2. 可以,但除非您的需求比看起来更专业,否则通用数据库管理器可能是更好的选择。
  3. 对于这样的事情,我会考虑使用可用的(许多)可嵌入数据库管理器之一。

鉴于您(显然)这样做主要是为了自我教育,而不是真正使用,因此在没有数据库管理器来处理存储的情况下编写代码可能是有意义的。自己编写所有代码(稍加小心)通常会导致速度稍快,但代价是相当多的额外工作,并且通常会损失一些灵活性。从学习的角度来看,最大的问题是你学到的很多东西只适用于相当狭窄的环境(即,对于大多数典型的应用程序,你想要使用数据库管理器,所以学习不这样做很少会收获很多)。

有点还取决于您的预期用途/受众。如果您想一次支持多个用户,那么事情几乎立即变得更加困难(至少这样做很有效)。如果您只对一个用户一次能够访问数据库感兴趣,那会让事情变得简单得多。

于 2010-05-22T16:11:01.427 回答
1
  1. 是的
  2. 这取决于数据,“大量数据”是相对的,您可能会发现关于 1000 本书的信息可以存储在几个 MB 中,那么将其存储在 DB 中将是一种矫枉过正,除非它是轻量级 DB,例如sqlite
  3. 我建议坚持使用纯文本格式,例如CSVXML

为了学习,不使用数据库引擎对您有很大帮助,除非您想学习 SQL 和关系数据库设计。另一方面,使用数据库引擎将使开发更快、更容易,因为它会为不同的数据创建索引,以帮助您轻松高效地进行搜索。

所以这取决于你。

于 2010-05-22T16:16:04.847 回答
1

嗯……

当然,您可以这样做。

您所说的所做的是及时回到 RDBMS 成功之前的时期。这并不难做到,但你可能会吸取一些教训:

  1. 在你开始编码之前——或者,至少,在你写数据访问代码之前,你的数据库设计就像你要使用一个数据库一样——你需要什么数据?你能减少你需要的属性(“字段”)的数量吗?您库中媒体类型的共性是什么?等等
  2. 考虑使用目录树和文件名作为一种临时存储结构。如果您需要或想要管理超出程序当前能力的数据,这会将数据直接交给命令行实用程序。例如,书籍可能都在书籍子目录中,并且在其中,您可以使用 ISBN 或标题作为文件名。我会使用 ls、dir 或 CLI 使用的任何文件名查找自然排序为文件名的内容。
  3. 另一个不错的选择是将其放入 XML 格式。可能两者兼有 - 对整体数据布局使用目录层次结构,并将库条目数据以 XML 格式放在平面文件中。这在某些时候可能会很方便。
  4. 仅将数据以纯文本格式作为字符串放入 - 没有二进制数据!再次,这对于能够访问/操作程序外部的数据很重要。
  5. 有了这样的策略,如果需要,您可以使用 grep、sed、lex 等系统工具对数据做完全计划外的事情。
  6. 有一个功能 - 或编写一个单独的阅读器程序 - 遍历您的“数据库”并将其全部内容输出为纯文本,每个条目一行。您可能有选项告诉它要输出哪种媒体等。此外,包括一个标志,可让您设置输出属性之间使用的分隔符 - 逗号分隔是一种常见选择,但您可能也只想要一个空格,回程车,新线,或其他任何东西。如果您将其设为可选标志以允许用户使用任何内容并提供您最喜欢的默认值,那应该没问题。
  7. 模块化您的代码,以便您以后可以根据需要替换存储策略,而不必重新破解整个程序。您甚至可以提供多种存储策略。

这个应该可以的。

请注意,您将使用现代计算机硬件管理的数据量不太可能成为性能或空间问题,因此不必担心节省几个字节 - 这不值得麻烦。

祝你好运,享受旅程。

于 2010-05-22T16:22:47.667 回答
0

我也会推荐SQLite

从他们的网页:

“SQLite 是一个实现自包含、无服务器、零配置、事务性 SQL 数据库引擎的软件库。SQLite 是世界上部署最广泛的 SQL 数据库引擎。SQLite 的源代码在公共领域。”

“不要把 SQLite 看作是 Oracle 的替代品,而是 fopen() 的替代品”

于 2010-05-22T17:02:08.973 回答