如何实现简单的关系数据库?

时间:2013-10-14 23:57:52

标签: c++

请注意,这个问题仅关于C ++ ,我对使用现有数据库库不感兴趣,也不寻求“c ++中的数据库”的通用解决方案。我有一个特定的问题,并且遵循以下问题的最有效(在时间,空间和最佳实践方面)解决方案。

假设我有一系列书籍,由IdISBNAuthorName描述。 Name列将是一个与单独的作者表相关的ID,其中包含IdSurnameFirst Name列。我希望能够有效按名称和作者进行搜索。我将如何构建这个,以及我将使用哪些容器?

此主题已在SOelsewhere上多次展开,但从未提及与C ++或不使用现有库的实现相关的答案。

天真的解决方案只是创建两个单独的类:AuthorBook

class Book
{
public:
  int id;
  std::string isbn;
  Author* author;
  std::string name;
};

class Author
{
public:
  int id;
  std::string surname;
  std::string givenName;
};

然后我可以创建Book和Author(指针)的向量。但是我如何有效地索引这些?假设我想通过它的ISBN找到一本书;我怎样才能在恒定或至少对数时间内做到这一点?这可能吗?这种问题有标准做法吗?

2 个答案:

答案 0 :(得分:4)

首先,标准容器不支持通过多个键进行索引 - 每个容器仅支持一个键。这可以是复合键,因此如果您有三本不同作者具有相同标题的书籍,您可以同时指定标题和作者以仅查找其中一个。但是,没有一个标准容器支持按标题或作者单独搜索。

Boost Multi-Index库可以直接支持每个项目的多个键。多指数教程example of creating foreign keys非常像您对使用感兴趣。

Multi-Index支持(红黑)基于树的索引和基于散列的索引。像往常一样,你在两个散列指数之间进行权衡通常可以更快地查找单个项目,但是基于树的索引支持不等式,所以如果你想要搜索范围(例如, “作者姓氏从'C'到'L'的姓氏”。

答案 1 :(得分:3)

如果您只需要反向映射,则索引的标准数据结构是哈希映射,如果您还需要排序,则需要二进制搜索树。在C ++中,它们分别是unordered_mapmap

  

假设我想通过其ISBN找到一本书;

创建unordered_map<std::string,Book*>,搜索将是固定时间。