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

How do I implement a simple relational database?

本文关键字:一个 简单 关系数据库 实现 何实现      更新时间:2023-10-16

请注意,这个问题涉及C++,我对使用现有的数据库库不感兴趣,也不寻求"c ++中的数据库"的通用解决方案。我有一个具体的问题,并且正在寻求以下问题的最有效(在时间,空间和最佳实践方面)解决方案。

假设我有一系列的书,分别是IdISBNAuthorNameName列将是一个 ID,它与单独的作者表相关,包含列 IdSurname First Name 列。我希望能够名称和作者有效地进行搜索。我将如何构建它,我将使用哪些容器?

这个主题已经在SO和其他地方被多次提出,但从来没有一个专门与C++或不使用现有库的实现相关的答案。

天真的解决方案是简单地创建 2 个单独的类: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;
};

然后,我可以创建书籍和作者(指针)的向量。但是,如何有效地为这些索引?假设我想按 ISBN 查找一本书;如何在恒定或至少对数时间内做到这一点?这可能吗?这类问题有标准做法吗?

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

Boost 多索引库相当直接地支持每个项目的多个键。多索引教程包含创建外键的示例,就像您有兴趣使用的那样。

多索引支持(红黑)基于树的索引和基于哈希的索引。像往常一样,你会在两者之间进行权衡——散列索引通常可以更快地查找单个项目,但基于树的索引支持不等式,所以如果你想要搜索范围之类的东西,它们通常更好(例如,"作者的书姓氏从'C'到'L'")。

索引的标准数据结构是哈希映射(如果只需要反向映射)或二叉搜索树(如果还需要排序)。在C++中,分别是unordered_map和地图。

假设我想按 ISBN 查找一本书;

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

相关文章: