8

我来自java背景。

但是我想从跨平台的角度来看待持久对象的最佳实践。

在我看来,有3个阵营:

  • ORM营
  • 直接查询阵营 eg JDBC/DAO, iBatis
  • LINQ 阵营

人们仍然对查询进行手工编码(绕过 ORM)吗?为什么,考虑通过 JPA、Django、Rails 提供的选项。

4

5 回答 5

6

没有一种持久性的最佳实践(尽管尖叫 ORM 是最佳实践的人数可能会让您不相信)。唯一的最佳实践是使用最适合您的团队和项目的方法。

我们使用 ADO.NET 和存储过程进行数据访问(尽管我们确实有一些帮助程序可以非常快速地编写,例如 SP 类包装器生成器、对象转换器的 IDataRecord 以及一些封装常见模式和错误处理的高阶过程) .

有很多原因我不会在这里讨论,但我只想说它们是对我们团队有用并且我们团队同意的决定。归根结底,这才是最重要的。

于 2008-12-12T12:26:15.473 回答
3

我目前正在阅读.net 中的持久对象。因此,我无法提供最佳实践,但也许我的见解可以为您带来一些好处。直到几个月前,我一直使用手工编码查询,这是我 ASP.classic 时代的一个坏习惯。

Linq2SQL - 非常轻量级且易于上手。我喜欢强类型查询的可能性以及 SQL 不会立即执行的事实。相反,它在您的查询准备好(应用了所有过滤器)时执行,因此您可以将数据访问与数据过滤分开。此外,Linq2SQL 允许我使用与动态生成的数据对象分开的域对象。我还没有在更大的项目上尝试过 Linq2SQL,但到目前为止它似乎很有希望。哦,它只支持 MS SQL,这是一种耻辱。

实体框架- 我玩了一点,不喜欢它。它似乎想为我做所有事情,并且它不适用于存储过程。EF 支持 Linq2Entities,它再次允许强类型查询。我认为它仅限于 MS SQL,但我可能是错的。

SubSonic 3.0 (Alpha) - 这是支持 Linq 的更新版本的 SubSonic。SubSonic 最酷的地方在于它基于模板文件(T4 模板,用 C# 编写),您可以轻松地对其进行修改。因此,如果您希望自动生成的代码看起来不同,您只需更改它:)。到目前为止,我只尝试了预览,但今天会看一下 Alpha。看看这里SubSonic 3 Alpha。支持 MS SQL,但很快将支持 Oracle、MySql 等。

到目前为止,我的结论是在 SubSonic 准备好之前使用 Linq2SQL,然后切换到它,因为 SubSonics 模板允许更多的自定义。

于 2008-12-12T11:33:34.310 回答
3

至少还有一个:系统流行度。

据我所知,什么对你来说是最佳的,很大程度上取决于你的情况。我可以看到对于非常简单的系统,使用直接查询仍然是一个好主意。此外,我看到 Hibernate 无法很好地处理复杂的遗留数据库模式,因此使用 ORM 可能并不总是一个有效的选择。如果您有足够的内存将所有对象放入 RAM,则系统流行度应该是无与伦比的快。不知道 LINQ,但我想它也有它的用途。

因此,通常情况下,答案是:了解各种工作工具,以便您能够使用最适合您的具体情况的工具。

于 2008-12-12T12:10:42.417 回答
2

最佳做法取决于您的情况。

如果您需要具有某种有意义结构的表结构中的数据库对象(因此每个字段一列,每个实体一行等),您需要在对象和数据库之间存在某种转换层。这些分为两个阵营:

  • 如果数据库中没有逻辑(只是存储)并且表很好地映射到对象,那么 ORM 解决方案可以提供快速可靠的持久性系统。Toplink 和 Hibernate 等 Java 系统是这方面的成熟技术。

  • 如果持久性涉及到数据库逻辑,或者您的数据库模式已明显偏离您的对象模型,则由数据访问对象包装的存储过程(您喜欢更多的模式)比 ORM 涉及更多但更灵活。

如果您不需要结构化存储(并且您需要确定不需要,因为将其引入现有数据并不好玩),您可以将序列化的对象图直接存储在数据库中,绕过很多复杂性。

于 2008-12-12T14:21:12.683 回答
2

我更喜欢编写自己的 SQL,但这样做时我会应用我所有的重构技术和其他“好东西”。

我编写了数据访问层、ORM 代码生成器、持久层、UnitOfWork 事务管理和大量 SQL。我已经在各种形状和大小的系统中做到了这一点,包括极高性能的数据馈送(40000 个文件,每天总计 4000 万个事务,每个在两分钟内实时加载)。

最重要的标准是命运,因为它控制着它。永远不要让你的 ORM 工具成为你完成工作的障碍,或者做不正确的借口。归根结底,所有好的 SQL 都是手写和手动调整的,但是一些不错的工具可以帮助您快速获得一个好的初稿。

我对待这个问题的方式与我做 UI 设计的方式相同。我直接用代码编写所有 UI,但我可能会使用视觉设计器对我想到的一些基本元素进行原型设计,然后我将它生成的代码拆开以启动我自己的代码。

因此,使用任何形式的 ORM 工具作为获得体面示例的一种方式——看看它如何解决出现的许多问题(密钥生成、关联、导航等)。拆开它的输出,把它变成你自己的,然后再利用它。

于 2008-12-16T00:40:43.427 回答