首页 / 知识
哪个 ORM 框架可以最好地处理 MVCC 数据库设计?
2023-04-14 09:09:00

Which ORM framework can best handle an MVCC database design?当设计一个使用 MVCC(多版本并发控制)的数据库时,你创建的表要么是一个布尔字段,如 "IsLatest",要么是一个整数 "VersionId",你永远不会做任何更新,你只当事情发生变化时插入新记录。 MVCC 为您提供对需要详细历史记录的应用程序的自动审核,它还减轻了数据库在更新锁方面的压力。缺点是它会使您的数据大小更大并减慢选择速度,因为获得最新版本需要额外的子句。它也使外键更加复杂。 (请注意,我不是在谈论 RDBMS 中的本机 MVCC 支持,例如 SQL Server 的快照隔离级别) 这已在 Stack Overflow 上的其他帖子中讨论过。 [待办事项 - 链接] 我想知道,哪些流行的实体/ORM 框架(Linq to Sql、ADO.NET EF、Hibernate 等)可以干净地支持这种类型的设计?这是对典型 ActiveRecord 设计模式的重大改变,所以我不确定现有的大多数工具是否可以帮助那些决定使用他们的数据模型走这条路的人。我对如何处理外键特别感兴趣,因为我什至不确定对它们进行数据建模以支持 MVCC 的最佳方法。 我设计了一个类似的数据库(只有 INSERT — 没有 UPDATE,没有 DELETE)。 我几乎所有的 SELECT 查询都是针对每个表的当前行的视图(最高修订号)。 视图看起来像这样……
我的插入(以及更新和删除)都由存储过程(每个表一个)处理。 存储过程看起来像这样……
在 Visual Basic 代码中按事务处理修订号...
我为每个表创建了一个对象,每个表都有构造函数、实例属性和方法、create-update-delete 命令、一堆查找函数和 IComparable 排序函数。这是大量的代码。 一对一的 DB 表到 VB 对象...
这样的系统会保留每一行的所有过去版本,但管理起来确实很麻烦。 优点:
缺点:
结论:
我很好奇 Microsoft Entity Framework 是否可以很好地处理此类数据库设计。 Jeff 和 Stack Overflow 团队的其他成员在开发 Stack Overflow 时必须处理类似的问题:已编辑问题和答案的过去修订被保存和检索。 我相信 Jeff 说过他的团队使用 Linq to SQL 和 MS SQL Server。 我想知道他们是如何处理这些问题的。 我可能会考虑纯粹在数据库中实现 MVCC 层,使用存储的过程和视图来处理我的数据操作。然后,您可以为任何能够映射到存储过程和从存储过程映射的 ORM 提供一个合理的 API,并且您可以让数据库处理数据完整性问题(因为它几乎是为此而构建的)。如果你走这条路,你可能想看看像 IBatis 或 IBatis.net 这样更纯粹的 Mapping 解决方案。 查看 Envers 项目 - 与 JPA/Hibernate 应用程序配合得很好,基本上可以为您做到这一点 - 跟踪另一个表中每个实体的不同版本,并为您提供类似 SVN 的可能性("给我 Person 的版本使用 2008-11-05...") http://www.jboss.org/envers/ /詹斯 据我所知,ORM 框架会希望为您生成 CRUD 代码,因此必须明确设计它们以实现 MVCC 选项;我不知道有什么开箱即用的。 从实体框架的angular来看,CSLA 根本不会为您实现持久性——它只是定义了一个"数据适配器"接口,您可以使用它来实现您需要的任何持久性。因此,您可以设置代码生成(CodeSmith 等)模板来为您的 CSLA 实体自动生成与 MVCC 数据库架构一起使用的 CRUD 逻辑。 这种方法适用于任何实体框架,很可能不仅仅是 CSLA,但它会是 CSLA 中非常"干净"的实现。 我们所做的只是使用普通的 ORM (hibernate) 并使用视图而不是触发器来处理 MVCC。 所以,有一个 v_emp 视图,它看起来就像一个普通的表,你可以在其中插入和更新,但是当你这样做时,触发器实际上会处理将正确的数据插入到基表中。 不.. 我讨厌这种方法 :) 我会按照 Tim 的建议使用存储过程 API。 我一直认为您会在更新和删除时使用 db 触发器将这些行推送到 TableName_Audit 表中。 这将与 ORM 一起使用,为您提供您的历史记录,并且不会削弱该表上的选择性能。这是个好主意还是我错过了什么? |
最新内容
相关内容
linux下抓取字段命令?
linux下抓取字段命令?,数据,系统,命令,单位,报告,工具,字符串,文件,范本,样式,Linux系统怎么使用awk命令处理文字数据?其中command是真正的awklinux数据库查找命令?
linux数据库查找命令?,位置,名称,状态,服务,软件,信息,系统,命令,名字,密码,在linux中如何用命令查找文件在哪使用查找命令 “find”命令允许linux数据库同步命令?
linux数据库同步命令?,信息,系统,汽车,车辆,服务,工作,通信,一致,分析,数据,DB2数据库在linux操作系统的指令有哪些?1、linux系统常用操作命令linux提取字段串命令?
linux提取字段串命令?,数字,字符串,状态,工具,命令,文件,范本,样式,正则,字段,linux如何获取两个字符串之间的内容?1、在 Linux 中,您可以使用linux建立数据库命令?
linux建立数据库命令?,软件,系统,工作,数据,密码,工具,数据库,一致,网络,服务,linux中在shell中怎么创建一个数据库1、以下的文章主要讲述的是linux命令进数据库?
linux命令进数据库?,地址,系统,名字,服务,密码,命令,读法,数据库,操作系统,主机,linux系统mysql数据库怎么进入数据库首先确保linux下mysql安linux数据库检查命令?
linux数据库检查命令?,服务,状态,地址,位置,系统,信息,命令,工作,情况,密码,在linux中,怎样查看Mysql服务运行状态?1、psaux或netstat-tlunppslinux命令进去数据库?
linux命令进去数据库?,地址,服务,名字,系统,数据库,工具,基础,工作,管理,网络,linux系统mysql数据库怎么进入数据库(linux进入mysql数据库命令linux数据库基础命令?
linux数据库基础命令?,地址,工作,基础,系统,命令,信息,情况,工具,设备,目录,linux下基本命令使用讲解对Linux操作系统进行维护操作的实用命令数据库导出命令linux?
数据库导出命令linux?,数据,系统,名称,密码,软件,服务,情况,网上,工具,文件,Linux系统下mysqdump在导出数据时,没有指定任何目录,那么导出的文linux数据库删除命令?
linux数据库删除命令?,软件,服务,产品,名称,系统,不了,地址,管理,电脑,命令,Linux下如何手动删除Oracle11g数据库于是尝试了下手动的删除ORACLlinux数据库操作命令?
linux数据库操作命令?,信息,系统,网络,地址,分析师,数据,名称,管理,基础,命令,linux必学的命令是什么?.基础编程:gcc:编译C/C++程序。make:自动化