如何将C ++结构转换为数据库

时间:2011-03-29 12:16:08

标签: c++ database sqlite database-design

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

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

假设我有以下结构:

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

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

我首先想到的是每个结构的一个表,结构中有许多列作为元素,但它似乎不易维护。

由于

1 个答案:

答案 0 :(得分:3)

您需要考虑很多事情。

首先,您是否希望数据库具有可读结构?或者您可以使用数据库中非常难以理解的数据,但更适合映射到您的结构?

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

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

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

  • 您是否会清空数据库并重新填充(就像重新创建文件一样)?
  • 您是否会有选择地更新数据库中的记录(但是您需要在表中使用密钥)?

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

从文件到数据库对你来说似乎很简单,但它不是。事先考虑您想要对数据库做什么,并预见到有足够的时间来设计数据库并编写代码来访问数据库。