我正在尝试确定在构建数据层时将对象用于关系映射层(如hibernate或Microsoft Entity框架)有什么优点或缺点。
从长远来看,手动使用sql和映射对象还是更好地利用其中一种映射技术?
对于简单的应用程序来说,额外的映射层可能是有利的,因为该工具可以处理简单的映射和sql因此节省了一些时间,但是当对象模型变得更复杂时呢?
如果有的话还有什么性能影响?
感谢您提供的任何见解。
答案 0 :(得分:4)
您最好的选择是确保无论您做什么,都可以保留以后更改的能力。因此,如果你去NHibernate或EF,你会希望框架的实际依赖关系保持非常紧密;同样适用于手动实施。
尝试实施Repository模式,然后您可以构建一个NH-repo,EF-repo等等,并查看最适合您的模式。
我个人的意见是进行正确的OR映射(无论是手工还是框架) - 这里的含义是您的业务/域对象 不 看起来像你的桌子,反之亦然。 ORM的重点不仅仅是将数据从数据库中移出并进入您的应用程序(DataSet也很好),但是为了让您在应用程序中充分利用OOP的优势,你后端的RDBMS。
如果您只是将SQL用作“哑存储”(我最喜欢使用它),那么您可以考虑使用OODB或其他对象持久性方法。在业余爱好/侧面项目中探索这总是一件有趣的事情 - 但是向管理层出售(他们放弃他们的SQL Server)是一件很难的事情,但是值得考虑。
当然,如果您正在谈论非常小的应用程序,那么也许您可以实现遵循Active Record模式或者事务脚本模式的东西 - XScript非常适合非常小的应用程序,但是不能很好地扩展 - - 和Active Record非常适合数据输入/ CRUD应用程序
答案 1 :(得分:2)
对于简单的应用程序来说,额外的映射层可能是有利的,因为该工具可以处理简单的映射和sql因此节省了一些时间,但是当对象模型变得更复杂时呢? < / p>
实际上,我会说这是另一种方式。
在具有复杂对象模型的较大应用程序中使用ORM更有意义:
对于使用简单数据库模型的非常小的应用程序,ORM可能过度,因为持久层将很容易实现而不会在某处引入错误,并且ORM不会为您节省太多工作。
另一方面,对于具有更复杂的数据库数据模型的大型应用程序,更容易让您的JOIN
和UPDATE
等错误,因此ORM可能会真有帮助。
答案 2 :(得分:1)
如果这是的问题“我是否应该使用ORM?”那么你的问题就没有绝对的答案,每种方法都需要权衡利弊,无论是积极的还是消极的。< / p>
ORM可以帮助您快速启动和运行,尤其是在您拥有更大的数据模型时。如果您需要生成多个不同的持久层,它们也可以很好,因为您支持多个数据库供应商使用相同版本的产品。 ORM并不像以前那么糟糕,它们现在相当有效。
就个人而言,虽然我不是他们的粉丝 - 我认为如果你掌握了数据库技能,那么你应该使用它们。我认为ORM倾向于保护开发人员免受数据库复杂性的影响,这不一定是件好事。我喜欢调整我的数据访问和存储,虽然编写代码将数据集映射到域对象可能很乏味但不是那么难或容易出错,我知道完全始终在发生什么,任何地方都没有神奇的事情发生。如果存在性能问题或效率低下,那么我可以非常快速地跟踪它们并修复它们。
答案 3 :(得分:1)
您可以构建自己的ORM映射工具。例如这里 http://askcodegeneration.com/php/generate-propel-schema-for-php-symfony/
一个推进orm架构是从一个简单的描述类格式生成的(没有什么可以阻止它用于任何其他语言,如c#和任何orm框架,如Hibernate,事实上将来我打算这样做):
class-list: [question answer user interest relevancy]
Sample-Model: {
class question [
Id: 0
title: ""
body: ""
created_at: 'now
updated_at: 'now
user_Id: [User]
]
class answer [
Id: 0
question_Id: [question]
user_id: [user]
body: ""
created_at: 'now
updated_at: 'now
]
class user [
Id: 0
first_name: ""
last_name: ""
created_at: 'now
]
class interest [
question_id: [question]
user_id: [user]
created_at: 'now
]
class relevancy [
answer_id: [answer]
user_id: [user]
score: 0
created_at: now
]
}