我一直在研究用于安排电视录制的PVR后端,而我正试图找出保留一个包含所有相关信息的简单数据库的最佳方法。我把一个懒人的原型放在一起(如下所示),但是我不想静态地分配大型数组,然后简单地将ram的内容转储到磁盘上进行存储。
鉴于以下懒惰/不良练习原型,我最好的选择是什么?有经验的程序员会选择做这样的事情吗?如果我要在不使用toString / fromString函数的情况下完成所有操作,我该怎么做?
struct Recording{
Date date;
int channel;
int length; //length in hours, minutes, or seconds
bool is_interlaced; //if true, denotes that the episode is interlaced
bool done; //if true, denotes that the episode has been recorded
bool record_successful; //Currently unused
};
struct TV_Episode{
struct Recording recording;
char title[128]; //Episode Title
char season; //Season number
char episode; //Episode number
};
struct TV_Show{
char name[64]; //TV Show name
char numepisodes; //The number of episodes in the array
struct TV_Episode episodes[100]; //Array containing airings of a TV show
};
struct Movie{
struct Recording recording;
char title[128]; //Movie Title, optionally including the year in brackets
};
struct Recordings_DB{ /*
* Obviously these types can be done away with using inheritance
* and the Recordings_DB type can be done away with using a vector.
* They are just here to illustrate the concept.
*/
struct TV_Show shows[20];
struct Movie movies[20];
};
答案 0 :(得分:0)
如果您不想静态分配数组,那么为什么不使用std::string
和std::vector
?您可以动态分配到正确的大小,并且您对最大大小没有限制。这是双赢。
也不要将char
用于整数值。那种便士捏是不必要的。它只会回来咬你。还记得Y2K吗?信不信由你现代计算机有大量的内存和磁盘空间。在许多情况下,由于填充,你实际上并没有节省任何内存。
答案 1 :(得分:0)
它可能会有点烦人,因为您需要编写自己的序列化代码(tostring / fromstring)或采用库。如果您自己编写,请务必考虑将字段添加到其中一个结构但希望能够以旧格式读取的情况;提前规划有助于解决这个问题。
您可能考虑的两个选择是Google的协议缓冲库(您可以定义协议缓冲区而不是结构,然后您可以序列化顶级的RecordingsDB)或SQLite(您必须编写一些基本的SQL来填充字段,但你也得到索引和交易)。如果您的数据库永远不会超过几千条记录,我建议使用协议缓冲区,因为SQL不会给您带来太多好处。两者都是相当紧凑,简单的库,得到了很好的支持。
答案 2 :(得分:0)
我实际上在PVR机顶盒世界工作了5年以上,而在我的旧公司,我们面临着类似的选择。由于您的目的是将PVR记录存储在磁盘上,以下是您可以采取的一些方法 -