将自定义平面数据库转换为SQLite等基于SQL的数据库

时间:2017-12-09 07:53:51

标签: database software-design

我们公司多年来一直使用一些平面文件作为数据库,它有一个固定结构,不幸的是没有额外的空间。现在他们想要添加一些新字段,甚至可以更灵活地轻松添加新字段。我有一段时间在这里工作,他们把这个任务给了我。

我有两个问题:

  1. 首先,我决定将其转换为基于SQL的数据库,如SQLite,我编写了一个小程序并使用API​​ sqlite3_prepare_v2和sqlite_bind_ *(18个文件)将我们的旧数据库转换为SQLite,但它需要永远。这是四天,它只是从500,000条记录中转换了大约37,000条记录。
  2. 我如何改进这个过程,有没有更好的方法?因为通常有大约30到90个单独的平面文件,每个文件中有大约500,000到10,000,000个记录。 因此,通过考虑最大值,我们应该处理sbout 90 * 10,000,000条记录

    1. 我的第二个问题是,保持这个固定的平面文件是否合理只是一些修改(聪明的闷热)?如果你在我的情况下你会怎么做? (我希望这个问题在这里问题不是不合适的,因为在这种情况下我真的需要一些建议,但如果不能问这些问题我很抱歉)
    2. 值得一提的是,这些数据库中的信息非常敏感,我们的方法应该能够免受意外事件的影响,例如电源故障等等(能够从中恢复)。此外,失去甚至一条记录对我们公司及其客户来说至关重要。

      更新1 :(包括一些剪切代码)

      const char sql = "INSERT INTO MetaData ("
       "Field_1,"
       "Field_2,"
       /* 16 other fields */
       ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
      
       for (unsigned record = 0; record <= header.endpos; record++) {
         rc = sqlite3_precpare_v2(db, sql, strlen(sql), &stmt, &pzTail);
         if (rc) {
           fprintf(stderr, "cannot prepare database,\n");
           goto failed1;
         }
      
         dwReadCount = 0;
         ReadFile(hIndex, &index, sizeof(index), &dwReadCount, NULL);
      
         sqlite3_bind_int(stmt, 1, index.field1);
         sqlite3_bind_int(stmt, 2, index.field2);  
         /* 16 same other binding
         */
         ..
         ..
         ...
      
         sqlite3_step(stmt);
         sqlite3_finalize(stmt);
       }
      

      我感谢任何帮助或暗示。

      由于

0 个答案:

没有答案