目前持久性的最佳实践是啥?
Posted
技术标签:
【中文标题】目前持久性的最佳实践是啥?【英文标题】:What is the best practice for persistence right now?目前持久性的最佳实践是什么? 【发布时间】:2008-12-12 10:19:57 【问题描述】:我来自java背景。
但我想从跨平台的角度了解什么是持久对象的最佳实践。
在我看来,有3个阵营:
ORM 阵营 直接查询阵营例如JDBC/DAO、iBatis LINQ 阵营人们仍然对查询进行手工编码(绕过 ORM)吗?为什么,考虑通过 JPA、Django、Rails 提供的选项。
【问题讨论】:
【参考方案1】:没有一种持久性的最佳实践(尽管有很多人大声疾呼 ORM 是最佳实践可能会让您不这么认为)。唯一的最佳做法是使用最适合您的团队和项目的方法。
我们使用 ADO.NET 和存储过程进行数据访问(尽管我们确实有一些帮助程序可以使编写速度非常快,例如 SP 类包装器生成器、对象转换器的 IDataRecord 以及一些封装常见模式和错误处理)。
这有很多原因,我不会在此赘述,但足以说明它们是对我们团队有效且我们团队同意的决定。归根结底,哪一个才是最重要的。
【讨论】:
【参考方案2】:我目前正在阅读 .net 中的持久对象。因此,我无法提供最佳实践,但也许我的见解可以为您带来一些好处。直到几个月前,我一直使用手工编码查询,这是我 ASP.classic 时代的一个坏习惯。
Linq2SQL - 非常轻量级且易于上手。我喜欢强类型查询的可能性以及 SQL 不会立即执行的事实。相反,它在您的查询准备好(应用了所有过滤器)时执行,因此您可以将数据访问与数据过滤分开。此外,Linq2SQL 允许我使用与动态生成的数据对象分开的域对象。我还没有在更大的项目上尝试过 Linq2SQL,但到目前为止它似乎很有希望。哦,它只支持MS SQL,这是一个耻辱。
Entity Framework - 我玩了一点,但不喜欢它。它似乎想为我做所有事情,并且它不适用于存储过程。 EF 支持 Linq2Entities,它再次允许强类型查询。我认为它仅限于 MS SQL,但我可能错了。
SubSonic 3.0 (Alpha) - 这是支持 Linq 的更新版本的 SubSonic。 SubSonic 最酷的地方在于它基于模板文件(T4 模板,用 C# 编写),您可以轻松地对其进行修改。因此,如果您希望自动生成的代码看起来不同,您只需更改它:)。到目前为止,我只尝试了预览,但今天会看一下 Alpha。看看这里SubSonic 3 Alpha。支持 MS SQL 但很快将支持 Oracle、mysql 等。
到目前为止,我的结论是在 SubSonic 准备好之前使用 Linq2SQL,然后切换到它,因为 SubSonics 模板允许更多的自定义。
【讨论】:
Re: EF 仅限于 MS SQL - 开箱即用 - 是的,但是有 3rd 方合作伙伴为其他 RDBMS 开发提供程序。因此,例如,如果您想要 ORACLE,那么一家名为 DevArt 的公司既有 ORACLE 的 EF 提供程序,也有 LINQ-to-ORACLE 实现。【参考方案3】:至少还有一个:System Prevalence。
据我所知,最适合您的方法很大程度上取决于您的情况。我可以看到对于非常简单的系统,使用直接查询仍然是一个好主意。此外,我已经看到 Hibernate 无法很好地处理复杂的遗留数据库模式,因此使用 ORM 可能并不总是一个有效的选择。如果您有足够的内存将所有对象放入 RAM,则系统流行度应该是无与伦比的快。不知道 LINQ,但我想它也有它的用途。
因此,通常情况下,答案是:了解各种工作工具,以便您能够使用最适合您具体情况的工具。
【讨论】:
系统普遍性错误地假设如果您可以将所有对象放入 RAM 中,它将快速运行。好吧,它不会。有报道称,即使是现代垃圾收集器在必须处理数百万个对象时也会发疯。同样,如今,如果您的数据库服务器中有足够的内存,您可以获得与使用系统流行度相似甚至更快的性能,因为数据库针对性能进行了优化,而您的通用语言和垃圾收集器则没有。【参考方案4】:最佳做法取决于您的情况。
如果您需要具有某种有意义结构的表结构中的数据库对象(因此每个字段一列,每个实体一行等),您需要在对象和数据库之间设置某种转换层。它们分为两个阵营:
如果数据库中没有逻辑(只是存储)并且表可以很好地映射到对象,那么 ORM 解决方案可以提供快速可靠的持久性系统。 Toplink 和 Hibernate 等 Java 系统是这方面的成熟技术。
如果存在 涉及持久性的数据库逻辑,或者您的数据库架构已明显偏离您的对象模型,则由数据访问对象包装的存储过程(您喜欢的其他模式)是比 ORM 更复杂一点,但更灵活。
如果您不需要结构化存储(并且您需要真的确保您不需要,因为将其引入现有数据并不好玩),您可以直接存储序列化对象图在数据库中,绕过了很多复杂性。
【讨论】:
Re:第一个阵营,我不同意使用 ORM 解决方案更容易。构建系统中有很多设置可以让它正常工作。【参考方案5】:我更喜欢编写自己的 SQL,但我会应用我所有的重构技术和其他“好东西”。
我编写了数据访问层、ORM 代码生成器、持久层、UnitOfWork 事务管理和大量 SQL。我已经在各种形状和大小的系统中做到了这一点,包括极高性能的数据馈送(40000 个文件,每天总计 4000 万个事务,每个在两分钟内实时加载)。
最重要的标准是命运,因为它可以控制它。永远不要让你的 ORM 工具成为你完成工作的障碍,或者做不正确的借口。归根结底,所有优秀的 SQL 都是手写和手动调优的,但一些不错的工具可以帮助您快速获得良好的初稿。
我对待这个问题的方式与我做 UI 设计的方式相同。我直接用代码编写所有 UI,但我可能会使用可视化设计器对我想到的一些基本元素进行原型设计,然后将它生成的代码拆开以启动我自己的代码。
因此,使用任何形式的 ORM 工具作为获得一个体面示例的一种方式——看看它如何解决出现的许多问题(密钥生成、关联、导航等)。拆开它的输出,把它变成你自己的,然后再利用它。
【讨论】:
Rob,感谢您的 cmets。这很有启发性。我也更喜欢编写自己的 SQL。但我参与的几乎所有项目,他们都更喜欢使用 ORM。你提到的那个 4000 万/天的交易系统,它是在什么平台上运行的? SAN 上的 8 TB Oracle 10g 数据库,具有 4 GB RAM 的中级 SunFire 机器上的 Sun Solaris 10,通过 JBoss 和 WebLogic 10 上的 Web 服务公开的 Java 1.6以上是关于目前持久性的最佳实践是啥?的主要内容,如果未能解决你的问题,请参考以下文章
在 Angular 站点中使用 content-security-policy 的最佳实践是啥?