【问题标题】:How to convert a C++ structure into a database如何将 C++ 结构转换为数据库
【发布时间】:2011-07-25 05:55:01
【问题描述】:

我有一个使用不同结构进行配置的软件。每次我保存配置时,结构都会转储到二进制文件中,每次加载配置时,都会读取文件并用数据填充结构。

出于某种原因,我想更改它并使用数据库来存储软件的配置。不幸的是我真的不知道如何设计桌子。

假设我有以下结构:

typedef struct StructUser {
    BYTE readAccess;    
    BYTE writeAccess;
    BYTE passLength;
    BYTE nameLength;
    char pass[32];  
    char name[32];
}

您将如何构建具有最佳灵活性(添加或删除某些元素)和最佳性能(快速获取配置)的数据库?

我起初以为每个结构都有一个表,结构中有许多列作为元素,但它似乎不太容易维护。

谢谢

【问题讨论】:

  • 将结构字段映射到数据库表中的行是标准方法。只有了解所涉及的所有数据类型以及它们之间的关系,才能给出更详细的答案。
  • 不幸的是,所涉及的数据类型是多种(几乎都是 c++ 类型),并且可以根据软件的规范随时发展。在您看来,我的表格的每个字段都应该是我的 C++ 结构的一个元素?
  • 您可能对this question感兴趣。
  • 我不得不质疑 DB 是否是这里的最佳解决方案。可能某种分层的基于文本的格式更好(例如 XML 或 JSON)?甚至是分层二进制存储,您可以在其中写入流并请求子流写入子结构? DB 不擅长添加/删除具有子结构的字段。并且在只存储一条记录时没有任何优势。

标签: c++ database sqlite database-design


【解决方案1】:

您需要考虑很多事情。

首先,您是否希望您的数据库具有可读结构?或者您可以在数据库中使用完全不可读的数据,但更适合映射到您的结构?

  • 如果您想要一个可读的数据库结构(最好是第 3 或第 4 范式),请为您的数据库表提供与结构中的逻辑字段相对应的列。在许多情况下,这意味着每个结构字段一列,但在某些情况下,您可能希望将多个字段映射到一列,或将一个字段拆分为多个列。考虑使用 ORM(对象关系映射)工具来帮助您(例如,对于 Java,您有 Hibernate,对于 C/C++,可能有类似的工具)。
  • 如果您可以忍受数据库中不可读的数据,您可以将您的结构序列化为一个字符串,并将该字符串保存在数据库中。从数据库读取时,只需读取字符串并反序列化即可。然后,您的表只需要一列,即这个序列化字符串。

虽然序列化字符串方法可能会为您提供更快的初始解决方案,并且可能在不更改数据库的情况下更方便地更改结构,但从长远来看,您可能会遇到问题。拥有清晰的数据库结构意味着其他工具也可以使用您的数据库(例如 Access 等 RAD 工具)。因此,请考虑在 ORM 工具中进行调查。

其次,您的应用程序可能还需要将数据保存到数据库中。但是你打算怎么做呢?

  • 是否会清空数据库并重新填充(就像重新创建文件一样)?
  • 您是否会选择性地更新数据库中的记录(但随后您需要在表中添加一个键)?

您可能希望多个应用程序或用户将其配置存储在数据库中。因此,清空数据库并重新填充它可能不是一种选择(尽管有一些技巧可以解决这个问题,比如将用户名存储在第二列中,并清除该用户的所有内容)。因此,您需要将原始数据库键与您的结构一起存储,以便您知道以后需要更新哪些记录。同样,ORM 工具可以帮助您。

从文件转到数据库对您来说似乎很简单,但事实并非如此。事先考虑你想用你的数据库做什么,并预见足够的时间来设计你的数据库和编写访问数据库的代码。

【讨论】:

    猜你喜欢
    • 2013-06-20
    • 2012-02-19
    • 1970-01-01
    • 1970-01-01
    • 2017-02-09
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多