SQL结构与C ++ STL映射

时间:2014-12-16 01:33:46

标签: c++ sql database dictionary stl

我刚在学校完成了数据结构和算法(cpp)课程,我对现实世界中的数据库感兴趣...特别是SQL。

所以我的问题是SQL和例如c ++ stl std :: multimap之间有什么区别? SQL更快吗?或者我可以使用c ++ STL制作同样快速(时间复杂度明智)的自制SQL吗?

谢谢! (对不起,我刚开始在课程范围之外编程)

1 个答案:

答案 0 :(得分:4)

明显的区别是SQL查询语言与数据库交互而STL是库(通常,STL也用于指代某个子集standard C++ library)。因此,这些是苹果和橘子。

SQL实际上需要一套标准来指定数据库系统的各个部分。为了使数据库系统有用,需要满足某些特性(ACID。即使只是查看这些特征,也不要求STL容器满足它们。我认为只有一致性甚至可能需要STL容器:

  1. STL容器突变不需要是 atomic :当从其中一个变异函数中抛出异常时,容器可能变得不可用,即,STL容器只需要满足{{ 3}}。
  2. 如上所述,[成功]突变会产生一致的状态。
  3. STL容器目前无法变异和读取,即没有隔离的概念。如果要在并发环境中访问STL容器,则需要确保在容器发生变异时没有其他访问者(尽管没有mutator,但是可以拥有尽可能多的并发读取器。)
  4. 对于STL容器存在耐久性的概念,而可能认为数据库的核心功能是持久的(好吧,所有ACID功能都可以被视为核心数据库功能)。
  5. 数据库内部肯定使用一些数据结构和算法来提供ACID功能。这是STL可能进入的领域,虽然主要是它的关键优势,即算法,它们不是真正的“basic exception guarantee”而是“特定问题的解决方案”:STL是高效算法库的基础,适用于任意数据结构(嗯,这就是目标 - algorithms)。遗憾的是,数据结构的重要领域并没有得到适当的覆盖。特别是关于I don't think it is, yet, achieved上的数据库算法,特别是trees往往很重要,但STL并未涵盖这些算法。

    STL容器std::multimap<...>确实包含一棵树(通常为b-trees,但并未强制要求),但它与此特定的内存中表示相关联。无法将用于实现此特定数据结构的算法应用于某些合适的持久表示。此外,std::multimap<...>仍然只使用一个密钥( multi 指的是允许多个元素具有相同的密钥,而不是具有多个密钥),而数据库通常需要多个查找机制({ {3}}在为每个查询执行基于red/black-tree的查询时使用。

    你有多个问题,有趣的一个(在我看来)是这样的:“...或者我可以用c ++ STL制作同样快速(时间复杂度明智)的自制SQL吗?”

    在STL涵盖所有算法的完美世界中,是的,您可以基于STL算法为数据库创建查询评估程序。您甚至可以使用某些STL容器作为辅助数据结构,尽管数据库中的主要数据结构在持久存储中正确表示。要创建一个实际的数据库,您还需要将查询转换为可以执行的良好查询计划。

    当然,如果您真正需要的只是通过程序在某个时刻读取的数据结构中的键进行一些查找,那么您将不需要一个完整的数据库,看起来可能更快使用合适的数据库STL容器。

    请注意,indices往往有助于指导对不同方法的快速评估。然而,在实践中,常数因素往往很重要,并且具有较差时间复杂度的算法通常表现得更好。规范示例是query plan,其优于典型输入的“优越”算法(例如time complexityquicksort)(尽管实际上使用heapsort实际上是mergesort的混合使用quicksort,heapsort和introsort,它结合了这些相应算法的强度,在所有输入上表现良好)。顺便说一句,要了解您可能想要观看insertion-sort的算法的说明。