使用独立的C ++应用程序存储数据
-
04-10-2019 - |
题
我与Apache,PHP和MySQL合作,用于Web开发和本地应用程序。在过去的几年中,我一直在慢慢学习C ++,并希望在今年夏天构建一个应用程序。具体来说,我想制作一个“库”应用程序,可以在其中存储有关我拥有的书籍,CD和记录的信息。我知道存在这种类型的应用程序,但是我想学习C ++,这似乎是一个很好的方法。
这里有几个问题:
是否可以创建不需要数据库存储数据的独立应用程序?
如果上面的#1答案是“是”,那么对于可能需要管理大量数据的应用程序来说,这样做是个好主意吗?
您建议与C ++应用程序一起使用哪些数据存储选项?
谢谢!
更新好吧,有很多很好的答案。这是一个很棒的网站,有很多贡献者。事实证明,我现在可能不需要走C ++路线。我现在意识到我最感兴趣地编写可以充当“库”组织系统的应用程序 更多的 比我想追求C ++。感谢大家的回答!
解决方案
是否可以创建不需要数据库存储数据的独立应用程序?
是的,您可以对存储数据进行某种自定义文件格式。
如果上面的#1答案是“是”,那么对于可能需要管理大量数据的应用程序来说,这样做是个好主意吗?
这不是一个好主意,除非您真的想学习将数据存储在结构化文件中。
您建议与C ++应用程序一起使用哪些数据存储选项?
我会看 sqlite. 。它是一个数据库,但不需要单独的引擎。
其他提示
如果您不想使用数据库,则可能需要将数据保存到文件(或一个以上)。如果是这样,问题可能是:哪种文件格式是最好的?答案取决于各种因素:
1)快速访问,尺寸小且易于解析?答案是“二进制数据”。只需使用直接将数据按原样写入输出文件 fwrite. 。有两个弊端:这些文件不是人类可读性的,并且要维护不同的版本很麻烦。如果您阅读的数据不是您的期望,那么您会迅速遇到麻烦。
2)人类可读且易于维护?这就是XML的目的。准备使用TinyXML等解析器,这是编写数据提交数据的绝佳工具。缺点是编写加载/保存例程需要更多的时间(很多情况)。
3)为您完成工作的库。 MFC提供了Carchive类,但是还有其他更好的工具可以做到这一点。
嗯...
当然,您可以做到这一点。
您正在谈论的事情是及时回到RDBMS成功之前的时期。这并不难,但是您可能会学到一些经验教训:
- 在开始编码之前 - 或至少在编写数据访问代码之前,您的数据库设计是否好像要使用数据库一样 - 您需要什么数据?您可以减少所需的属性数(“字段”)?图书馆中媒体类型之间的共同点是什么?等等
- 考虑使用目录树和文件名作为临时存储结构的一点。如果您需要或要管理超出程序的当前功能,这将直接将数据直接放在命令行实用程序的手中。例如,书籍可能都在书籍子目录中,在此中,您可以将ISBN或标题用作文件名。我寻找可以自然使用LS,DIR或您使用的CLI使用的文件名称。
- 另一个不错的选择是将其放置在XML格式中。可能两者 - 使用目录层次结构进行整体数据布局,并以XML格式将库条目数据放入平面文件中。这可能在某个时候很方便。
- 仅以纯文本格式将数据作为字符串 - 无二进制数据!再次,这很重要,因为能够访问 /操纵程序之外的数据。
- 通过这样的策略,您可以使用GREP,SED,LEX等系统工具在需要的情况下使用数据进行完全计划外的事情。
- 拥有一个功能 - 或编写单独的读取器程序,该程序将行走您的“数据库”,并将其整个内容输出为纯文本,每条条目一行。您可能有选项可以告诉它要输出哪种媒体等。此外,还包括一个标志,可以让您设置输出属性之间使用的定界符 - 逗号分隔是一个常见的选择,但是您也可能只想要一个空间,转叉返回,新线路或其他任何内容。如果您使其成为可选的标志,让用户使用 任何事物 并提供您喜欢的默认值,应该没问题。
- 模块化代码,以便以后可以替换存储策略,如果您选择的话,就不必重新组成整个程序。您甚至可以提供多种存储策略。
这应该做到这一点。
请注意,使用现代计算机硬件将管理的数据量不太可能成为性能或空间问题,因此不必担心节省一些字节 - 这不值得麻烦。
祝你好运,享受旅程。
- 是的。
- 可以,但是除非您的需求比看起来更专业,否则通用数据库管理器可能是更好的方法。
- 对于这样的事情,我想使用可用的(许多)可嵌入数据库管理器之一。
鉴于您(显然)主要是为了自我教育而不是真实使用, 可能 在没有数据库管理器的情况下编写代码以处理存储很有意义。自行编写所有代码(一点点护理)通常会导致速度略高,但要付出很多额外的工作,通常会损失灵活性。从学习角度来看,最大的问题是,您所学到的很多事情只会在相当狭窄的情况下适用(即,对于大多数典型的应用程序,您 将要 想要使用数据库管理器,因此学会无需获得很大的收益而学习)。
一点还取决于您的预期使用/受众。如果您想一次支持多个用户,事情会得到 很多 几乎立即困难(至少有效地这样做)。如果您只对一个用户一次访问数据库感兴趣,那使事情变得更简单。
我也会推荐 sqlite.
从他们的网页:
“ SQLITE是一个软件库,它实现了独立,无服务器,零配置,交易SQL数据库引擎。SQLITE是世界上部署最广泛的SQL数据库引擎。SQLITE的源代码在公共领域中。”
“将sqlite视为替代甲骨文,而是替代fopen()”