2013-10-05 30 views
0

我一直在PVR後端調度電視錄音,我試圖找出保持一個簡單的數據庫與所有的相關信息。我把一個懶惰的人的原型放在一起(如下所示),但我不想靜態分配巨大的數組,然後將這些對象的RAM內容轉儲到磁盤進行存儲。C++最簡單的數據庫存儲磁盤上的對象的數組或矢量的最佳方式

給出以下懶惰/不良練習原型,我的最佳選擇是什麼?有經驗的程序員如何選擇這樣做?如果我打算全部使用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

考慮類似XML或JSON的東西,並學習序列化到/從中。優點是你有一個結構化的文件,但是你在計算出來的東西時仍然是可讀的。 –

回答

0

我實際上在PVR機頂盒世界工作了5年以上,在我的老公司我們遇到了類似的選擇。因爲你的意圖是要在磁盤上存儲PVR錄製,這裏有一些方法你可以採取 -

  1. 二進制協議:轉儲C或C++ POD類型爲二進制文件。這將需要添加/刪除字段時難以保持兼容性的自定義分析器。也不是人類可讀的,所以調試將是一個痛苦。如果你出於速度或磁盤使用的原因而走這條路線,至少使用Google的protocol buffers作爲二進制協議。
  2. 序列化協議使用人類可讀協議(如XML,JSON)將數據序列化到磁盤或從磁盤序列化數據。易於調試,也可以添加/刪除字段到模式。許多開源解析器可用,例如expat,libxml2,rapidjson,json-c,可以爲你完成繁重的工作。
  3. 嵌入式數據庫如果您的系統需要支持排序,搜索,過濾等功能,我強烈推薦SQlite,這是一款適用於具有本機C接口的嵌入式平臺的輕量級數據庫。這個選項需要更多的開發工作,但隨着系統的發展,這個選項可以更好地擴展。
+0

感謝您的幫助。我很感激。我沒有編程一段時間,所以我很生疏,而且我從來沒有在高層次的東西上做過很多。你會推薦C++有沒有好的初學SQL教程? (我過去曾經使用過SQL,但它使用PHP,而不是C/C++) – KG6ZVP

+0

[權威指南Sqlite](http://www.amazon.com/Definitive-Guide-SQLite-Experts-Source/dp/ 1430232250 /)是一本深入瞭解SQLite C接口知識和最佳編碼實踐的書。我沒有使用過很多教程,但是[在線教程](http://www.tutorialspoint.com/sqlite/sqlite_c_cpp.htm)看起來很有前途。 – goran333

+0

感謝您的信息和亞馬遜鏈接,因爲我通常從他們訂購無論如何。我剛剛訂購了兩本關於SQL的書,我想我會在完成其他兩本時訂購這本書。我感謝幫助! – KG6ZVP

0

如果你不想靜態分配陣列,那麼爲什麼不使用std::stringstd::vector?您可以動態分配到正確的大小,並且不會限制最大大小。這是一場雙贏。

也不要使用整數值的char。這種一分錢捏是不必要的。它只會回來咬你。還記得Y2K嗎?相信現代計算機是否擁有大量內存和磁盤空間。而在很多情況下,由於填充,你實際上並沒有保存任何內存。

+0

使用char是更多的踢和踢再次玩。但是,我的意思是,存儲在磁盤上。另外,字符數組更多,所以我可以編寫一個我可以的方案,如果我真的想,只需將整個內存空間轉儲到硬盤驅動器,並在我尋找更好的選項時使其工作(因此,本文) – KG6ZVP

0

它可能會有點煩人,因爲您需要編寫自己的序列化代碼(tostring/fromstring)或採用庫。如果您自己編寫,請務必考慮將字段添加到其中一個結構中但希望能夠以舊格式讀取的情況;提前規劃有助於解決這個問題。

你可能考慮的兩種選擇是Google協議緩衝區庫(你可以定義協議緩衝區而不是結構體,然後你可以序列化頂級的RecordingsDB)或者SQLite(你將不得不編寫一些基本的SQL來填充這些字段,但你也得到索引和交易)。如果您的數據庫永遠不會超過幾千條記錄,那麼我推薦使用協議緩衝區,因爲SQL不會爲您帶來太多好處。兩者都是相當緊湊的,簡單的庫得到很好的支持。

相關問題