- 博客(23)
- 收藏
- 关注
翻译 15 Advanced Techniques and Mechanisms 高级技术和机制
本章介绍 ODB 提供的在某些情况下可能有用的高级技术和机制。
2024-10-29 16:01:08
134
翻译 ODB-7 Value Types 值类型
在第 3.1 节 “概念和术语 ”中,我们已经讨论了值和值类型的概念,以及简单值和复合值的区别。本章将详细介绍简单值类型和复合值类型。
2024-10-28 17:03:35
129
翻译 ODB 6 Relationships
虽然 ODB 运行时和配置文件库为大多数广泛使用的指针提供了支持,但也可以轻松添加对自定义智能指针的支持。要做到这一点,你需要为指针实现pointer_traits类模板专门化。第一步是确定指针类型,因为pointer_traits专门化的接口根据指针类型而变化。支持的指针类型有:raw(原始指针或其等价物,即非托管)、unique(不支持共享的智能指针)、shared(支持共享的智能指针)和weak(共享指针的弱对应)。
2024-10-28 11:56:28
148
翻译 ODB-12 Optimistic Concurrency 乐观并发
此时,应用程序有两个恢复选项:它可以中止并可能重新启动应用程序事务,也可以从数据库重新加载新的对象状态,重新应用或合并更改,并再次调用update()。收到用户输入后,我们将继续更新对象,用新的年龄(正确)覆盖旧的年龄,用旧的姓名(错误)覆盖新的姓名。版本数据成员由ODB管理。也就是说,如果我们在数据库事务中加载对象并在同一事务中更新它,那么我们可以保证我们在数据库中更新的对象状态与我们加载的状态完全相同。在我们的示例中,这意味着在一个数据库事务中加载对象,等待用户输入,然后在另一个数据库事务中更新对象。
2024-10-25 11:16:31
118
翻译 ODB-11 Session 会话
ODB可以使用自定义会话实现来代替默认的ODB::会话。应用程序提供自己的会话可能有多种原因。例如,应用程序可能已经包含ODB可以重用的对象缓存或注册中心的概念。自定义会话还可以提供其他功能,例如自动更改跟踪、延迟数据库操作或对象退出。最后,odb::session使用的每个线程一个会话的方法可能并不适合所有应用程序。例如,有些可能需要可以在多个线程之间共享的线程安全会话。对于通过保留对象的原始副本来实现自动更改跟踪的自定义会话的示例,请参阅odb-tests包中的common/session/自定义测试。
2024-10-24 17:57:44
116
翻译 ODB 10 Views 视图10.3-10.7
表视图类似于对象视图,不同之处在于它基于一个或多个数据库表而不是持久对象。表视图主要用于处理没有映射到持久类的临时表。要将一个或多个表与视图关联,我们使用db table pragma(第14.2.2节,“table”)。为了关联第二个表和后续表,我们对每个附加表重复db表pragma。例如,下面的视图基于我们在本章开头定义的employee_extra遗留表。除了db表pragma中的表名之外,我们还必须为每个视图数据成员指定列名。请注意,与对象视图不同,ODB编译器不会尝试自动为表视图提供列名。
2024-10-24 15:04:41
177
翻译 10.2 Object Loading Views 对象加载视图
实际上,这是视图加载的同一个对象,因为雇主使用相同的关系与视图关联(ODB自动使用它,因为它是唯一的关系)。从上面的讨论可以清楚地看出,如果我们正在加载的对象也是我们正在加载的另一个对象内部关系的一部分,那么我们应该使用某种形式的共享所有权指针。作为按值加载的最后一个例子,考虑以下视图,它实现了一个稍微高级一点的逻辑:如果对象已经在会话缓存中,那么它将视图(er_p)中的指针数据成员设置为该对象。为了加载一个完整的对象作为视图的一部分,我们使用对象类型指针的数据成员,就像对象关系一样(第6章,“关系”)。
2024-10-23 17:42:22
79
翻译 ODB-10 Views 视图
ODB 视图是一种 C++ 类或结构类型,它体现了一个或多个持久对象或数据库表或本地 SQL 查询执行结果的轻量级只读投影。视图的一些常见应用包括从数据库表的对象或列中加载数据成员的子集,执行和处理任意SQL查询的结果,包括聚合查询和存储过程调用,以及使用对象关系或自定义连接条件连接多个对象和/或数据库表。许多关系数据库也定义了视图的概念。但请注意,ODB 视图并不映射到数据库视图。相反,默认情况下,ODB 视图会映射到 SQL SELECT 查询。
2024-10-23 16:33:22
165
翻译 ODB-9 Sections 分组
ODB 切片是一种优化机制,它允许我们将持久类的数据成员划分为可以单独加载和/或更新的组。举例来说,如果一个对象包含加载或更新成本较高的数据成员(如 BLOB 或容器),而这些数据成员又不经常被访问或修改,那么这种方法就非常有用。例如odb-examples 软件包中的 section 目录提供了一个完整的示例,说明如何使用 section。为什么需要将数据成员分组?为什么不能在必要时独立加载和更新每个数据成员?
2024-10-23 14:18:08
97
翻译 ODB-8 Inheritance 继承
在 C++ 中,继承可以用来实现两个不同的目标。我们可以利用继承在多个类中重复使用共同的数据和功能。例如在上例中,雇员类和承包商类都从人员基类继承了 first_ 和 last_ 数据成员以及 first() 和 last() 访问器。这种继承风格的一个共同特征(从现在起称为重用继承)是在基类中缺少虚函数和虚析构函数。同样,使用这种风格,应用程序代码通常是根据派生类而不是基类编写的。在c++中利用继承的第二种方法是通过公共接口提供多态行为。
2024-10-22 17:44:53
118
翻译 13.4.2 Polymorphism Inheritance Changes 多态性继承变化
与重用继承不同,添加或删除多态基类不会导致从派生对象表中添加或删除基类的数据成员,因为多态层次结构中的每个类都存储在单独的表中。不过,由于特殊列(根表中的判别器和派生表中的对象 ID 链接)的存在,改变层次结构也会变得复杂,难以自动处理。我们完全支持在多态层次结构中添加或删除(包括软删除)叶类(或叶子层次结构)。任何更复杂的更改,如添加或删除根类或中间基类,或让现有类进入或退出多态层次结构,都可以通过创建新的叶子类(或叶子子层次结构)、软删除旧类和迁移数据来处理。
2024-10-22 14:51:32
58
翻译 13.4.1 Reuse Inheritance Changes 重复使用继承变更
除了添加和删除数据成员,另一种改变对象表的方法是使用重用式继承。如果我们添加一个新的重用基,那么从数据库模式的角度来看,这就相当于将其所有列添加到派生对象的表中。同样,删除重用继承也会导致从派生对象表中删除基类的所有列。不过,目前可以通过软添加和删除数据成员来模拟这种语义。下表描述了最常见的情况,具体取决于添加或删除列的位置,即基表、派生表或两者。
2024-10-22 14:46:59
67
翻译 13.4 Soft Object Model Changes 软对象模型的更改
例如,我们可能会硬添加一个新的数据成员,而现有的迁移函数会尝试将其间接存储到数据库中,作为对象更新的一部分。例如,我们可能会意识到,在我们的应用程序中,将一个人的姓名存储为一个字符串比将其分成三个字段更好。因此,我们要做的是添加一个新的数据成员(我们称之为 name_),转换所有现有的拆分名称,然后删除 name_、middle_ 和 last_ 数据成员。建议的解决方法是删除与已删除数据成员相对应的访问器/修改器,将迁移函数设为被迁移类的静态函数,然后直接访问已删除的数据成员。软删除持久性类也是可行的。
2024-10-22 11:45:06
71
翻译 13.3.2 Gradual Data Migration 渐进式数据迁移
在逐步迁移的过程中,对象模型必须能够同时表示符合新旧格式的数据,因为一般来说,数据库将包含新旧对象的混合体。虽然我们可以在整个应用程序中添加必要的代码,但从维护的角度来看,最好还是将渐进迁移逻辑本地化到所影响的持久类中。例如,我们可以在更新对象时迁移数据,将其作为正常应用程序逻辑的一部分。虽然这种方法没有迁移成本(对象无论如何都会更新),但根据对象更新的频率,这种策略可能需要很长时间才能完成。关于这段代码,有几点需要注意。最后,在迁移函数中,我们只查询数据库中需要迁移的对象,即性别为 NULL 的对象。
2024-10-22 10:03:06
107
翻译 13.3 Data Migration 数据迁移
在很多情况下,为新数据成员指定默认值就可以处理现有对象。例如,我们添加的新中间名的默认值自然是空字符串。不过,在某些情况下,我们需要执行更复杂的数据迁移,即把旧数据转换成新格式。举个例子,假设我们想在人物类中添加性别。我们将尝试从名字中猜测性别,而不是让所有现有对象都不指定性别。正如我们前面所讨论的,有两种执行数据迁移的方法:立即迁移和逐步迁移。在渐进迁移中,我们要确保新的对象模型可以同时容纳新旧数据,并随着应用程序的运行和机会的出现(例如对象的更新),逐步迁移现有对象。
2024-10-21 17:26:54
133
1
翻译 13.2 Schema Migration 模式迁移
也就是说,我们可以迁移的最低版本和最终要迁移到的版本。因此,如果我们要将一个人的数据库从版本 1 迁移到版本 2,那么首先要执行 person-002-pre.sql,然后迁移数据(如果有的话)(下一节将详细讨论),最后执行 person-002-post.sql。例如,如果我们执行的 person.sql 对应于对象模型的版本 1,那么 name 将为空(这表示默认模式,因为我们没有指定 --schema-name),版本将为 1,而 migration 将为 FALSE。第二个版本指定特定模式的表。
2024-10-21 15:41:43
218
翻译 ODB 13 Database Schema Evolution 数据库模式演化
当我们添加新的持久化类或更改现有的持久化类时,例如,通过添加或删除数据成员后,存储新对象模型所需的数据库模式发生变化。同时,我们可能有包含现有数据的现有数据库。如果新不同版本的应用程序不需要处理旧数据库,然后再创建模式可能是你所需要的。然而,大多数应用程序都需要处理数据由同一应用程序的旧版本存储。我们将数据库模式演进称为更新数据库以匹配对象模型变化的总体任务。对象模型的变化。模式演进通常包括两个子任务:模式迁移和数据迁移。迁移和数据迁移。
2024-10-21 14:05:08
208
翻译 ODB 5 Containers
ODB运行时库为所有常用的标准c++ 98/03容器提供内置持久性支持,即std::vector、std::list、std::deque、std::set、std::multiset、std::map和std::multimap,以及c++ 11 std::array、std::forward_list、std::unordered_set、std::unordered_multiset、std::unordered_map和std::unordered_multimap。第二列包含容器中的元素索引。
2023-12-22 15:25:30
127
翻译 4 Querying the Database
与上面的execute()类似,prepare_query()和execute_one/value()可以看作query_one/value()函数被分成两个:prepare_query()接受第一个query_one/value()参数(查询条件),而execute_one/value()接受第二个参数(如果有的话)并返回结果。通常,如果我们计划多次运行相同的查询,我们将创建一个命名查询实例,并且对于那些只执行一次的查询使用内联版本(参见第4.5节,“准备查询”,以获得多次重新执行相同查询的更优方法)。
2023-12-22 10:25:47
220
翻译 ODB 3 Working with Persistent Objects
The previous chapters gave us a high-level overview of ODB and showed how to use it to store C++ objects in a database. In this chapter we will examine the ODB object persistence model as well as the core database APIs in greater detail. We will start with
2023-12-21 15:19:54
169
翻译 ODB 2 Hello World Example
相反,您所要做的就是将person-odb.hxx包含在c++文件中,在这些文件中使用来自person.xx的类执行数据库操作,并编译person-odb.cxx,并将生成的对象文件链接到您的应用程序。虽然所有这些方面在第16章“多数据库支持”中都有详细介绍,但在本节中,我们将通过扩展我们的“Hello World”示例来体验这个功能,使其能够在MySQL或PostgreSQL中存储数据(ODB支持的其他数据库系统可以以类似的方式添加)。然而,在这里,我们执行的是一个聚合查询,它总是只返回一个元素。
2023-12-20 16:05:46
238
1
翻译 ODB OBJECT-RELATIONAL MAPPING
例如,您可以自动将基本的c++类型映射到合适的SQL类型,为持久化类生成关系数据库模式,并使用简单、安全且功能强大的对象查询语言代替SQL。从应用程序开发人员的角度来看,ODB由三个主要组件组成:ODB编译器、称为libodb的公共运行时库和特定于数据库的运行时库,称为libodb-,其中是此运行时所针对的数据库系统的名称,例如libodb-mysql。它控制对象关系映射的各个方面,例如用于持久类及其成员的表和列的名称,或者c++类型和数据库类型之间的映射。
2023-12-20 13:50:27
250
1
翻译 ODB (1)
本手册的目标是让您了解对象持久化模型和由ODB实现的api。因此,本文档的目标读者是正在寻找c++对象持久性解决方案的c++应用程序开发人员和软件架构师。对关系数据库系统有基本的了解是有利的,但不是期望或要求的。随着我们生活中越来越多的关键方面越来越依赖于软件系统,越来越多的应用程序需要将它们处理的数据保存在持久可靠的存储中。特别是,这导致了许多现代应用程序使用的面向对象模型与RDBMS仍然使用的关系模型之间臭名昭著的不匹配。提供将ODB与广泛使用的框架和库(如Qt和Boost)的类型系统集成的配置文件。
2023-12-19 15:01:59
209
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅