如何实现一个简单的关系数据库
How do I implement a simple relational database?
请注意,这个问题仅涉及C++,我对使用现有的数据库库不感兴趣,也不寻求"c ++中的数据库"的通用解决方案。我有一个具体的问题,并且正在寻求以下问题的最有效(在时间,空间和最佳实践方面)解决方案。
假设我有一系列的书,分别是Id
、ISBN
、Author
和Name
。Name
列将是一个 ID,它与单独的作者表相关,包含列 Id
、 Surname
First Name
列。我希望能够按名称和作者有效地进行搜索。我将如何构建它,我将使用哪些容器?
这个主题已经在SO和其他地方被多次提出,但从来没有一个专门与C++或不使用现有库的实现相关的答案。
天真的解决方案是简单地创建 2 个单独的类: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 查找一本书;如何在恒定或至少对数时间内做到这一点?这可能吗?这类问题有标准做法吗?
首先,标准容器不支持通过多个键进行索引 - 每个容器仅支持一个键。这可以是一个组合键,因此如果您有三本不同作者的相同标题的书,您可以同时指定标题和作者以仅查找其中之一。但是,没有一个标准容器支持按标题或作者单独搜索。
Boost 多索引库相当直接地支持每个项目的多个键。多索引教程包含创建外键的示例,就像您有兴趣使用的那样。
多索引支持(红黑)基于树的索引和基于哈希的索引。像往常一样,你会在两者之间进行权衡——散列索引通常可以更快地查找单个项目,但基于树的索引支持不等式,所以如果你想要搜索范围之类的东西,它们通常更好(例如,"作者的书姓氏从'C'到'L'")。
索引的标准数据结构是哈希映射(如果只需要反向映射)或二叉搜索树(如果还需要排序)。在C++中,分别是unordered_map和地图。
假设我想按 ISBN 查找一本书;
创建unordered_map<std::string,Book*>
,搜索将是恒定的时间。
- 在c++中用vector填充一个简单的动态数组
- 如何使用 samtools C API 构建一个简单的主.cpp文件
- 为什么一个简单的程序不能立即启动
- C++ - 在我尝试制作一个简单的计算器时有一个"uninitialized local variable y used"警告
- 为什么 MSVC C++编译器将一个简单的 Hello World 扩展为 4000 行汇编?
- 我写了一个简单的矢量程序,在其中我得到了以下输出。你能帮我理解它的输出吗?
- 如何使用 c++ 在命令行中创建一个简单的字符控制器?
- 对于 ~95% 写入/5% 读取线程安全的无序列图,有没有一个简单的解决方案?
- 在C++中创建一个简单的数据包路由器,如何跟踪"客户端"?
- 创建一个简单的前向迭代器,该迭代器在循环缓冲区的"end"处自动换行
- 我已经安装了用于c++编程的升华3,但在编写了一个简单的程序后,我遇到了以下错误
- 如何设置一个简单的CGAL+Qt程序
- 如何在一个简单的C++项目中使用Poco库
- 我创建了一个简单的程序,但有些地方不对劲
- Qt的新信号/时隙语法问题 - 连接到一个简单的函数
- 一个简单的 win32 多线程代码.这能行吗?
- 我正在尝试构建一个简单的程序来从 mysql 数据库中读取信息
- 创建一个简单的计算器,添加时遇到问题
- 我正在编写一个简单的客户端套接字应用程序,但在连接后服务器收到一个空缓冲区
- 为什么一个简单的"Hello World"风格的程序不能用Turbo C++编译?