如何实现一个简单的关系数据库? 注意,这个问题只涉及C++,我不喜欢使用现有的数据库库,也不寻求通用的“C++数据库”解决方案。我有一个具体的问题,我在寻找最有效的(在时间、空间和最佳实践方面)解决以下问题的方法

如何实现一个简单的关系数据库? 注意,这个问题只涉及C++,我不喜欢使用现有的数据库库,也不寻求通用的“C++数据库”解决方案。我有一个具体的问题,我在寻找最有效的(在时间、空间和最佳实践方面)解决以下问题的方法,c++,C++,假设我有一系列的书,由Id,ISBN,作者和名称描述。Name列将是一个ID,它与一个单独的作者表相关,包含ID、姓氏、名字列。我希望能够有效地搜索姓名以及作者。我将如何构建它,我将使用什么容器 这个主题已经被多次提到,但从来没有关于C++的一个答案或一个不使用现有库的实现。p> 简单的解决方案是创建两个独立的类:Author和Book: class Book { public: int id; std::string isbn; Author* author; std::str

假设我有一系列的书,由
Id
ISBN
作者
名称
描述。
Name
列将是一个ID,它与一个单独的作者表相关,包含
ID
姓氏
名字
列。我希望能够有效地搜索姓名以及作者。我将如何构建它,我将使用什么容器

这个主题已经被多次提到,但从来没有关于C++的一个答案或一个不使用现有库的实现。p> 简单的解决方案是创建两个独立的类:

Author
Book

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找到一本书;我如何在常数时间或至少对数时间内做到这一点?这可能吗?这类问题是否有标准实践?

如果只需要反向映射,则索引的标准数据结构是哈希映射;如果还需要排序,则索引的标准数据结构是二进制搜索树。在C++中,它们分别是.< /p> 假设我想通过ISBN找到一本书


创建无序映射,搜索时间将保持不变。

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

库相当直接地支持每个项的多个键。多索引教程与您感兴趣的使用非常相似


多索引同时支持(红黑)基于树的索引和基于散列的索引。像往常一样,你会在这两种索引之间进行权衡——散列索引通常可以更快地查找单个项目,但基于树的索引支持不等式,因此如果你想搜索范围(例如,“作者的书名从‘C’到‘L’”),它们通常会更好。

这本书我希望有先发制人的功能“投票反对结束“能力。这是一个完全合理的问题,完全可以回答。虽然没有一个绝对的答案,但在可能性之间选择有合理的事实支持,而不仅仅是观点。这是一个非常普遍的问题,任何好的答案都是相当通用的——而不是针对C++的。假设你想要一个真实的、相当大的、健壮的DB,而不是简单的散列映射。@ HyTLIKSK我想得到一个有效的解决方案,它可以通过代码< > < <代码> >或<代码>作者>代码>的任何成员来使用C++来处理大量的项目。有多执着?正如我所说的,用哈希映射拼凑一些东西是相当容易的,但这不能处理10到数千个条目,也不允许持久的DB。(看一看开源SQLite。)@HotLicks Large与Large一样大,但在内存中,我对持久性或现有数据库实现不感兴趣。这个问题的目的是确定如何在常量或对数时间内索引这些关系表。好的,那么我将为我想要搜索的
Book
的成员创建一个无序的_映射?如果我选择删除
Book
的一个实例,我会为每个映射调用
unordered\u map::find
?我建议使用
std::shared\u ptr
作为映射类型,这样你就可以将一本书保存在多个查找表中,而不必担心手动内存管理。如果要删除一本书,必须将其从所有参考表中删除。