原始SQL与基于OOP的查询(ORM)?

原始SQL与基于OOP的查询(ORM)?,sql,database,database-design,orm,Sql,Database,Database Design,Orm,我在做一个需要频繁访问数据库、插入和删除的项目。我应该使用原始SQL命令,还是更喜欢使用ORM技术?没有任何对象,仅使用SQL命令,项目就可以正常工作?这通常会影响可伸缩性吗 编辑:项目是其中一种类型,其中用户不提供“我的内容”,但用户生成内容,并且项目处于联机状态。因此,内容的数量取决于用户的数量,如果项目有50000个用户,而且每个用户都可以创建内容或阅读内容,那么最合适的方法是什么?对于开发速度,我会选择ORM,特别是如果大多数数据访问都是CRUD 这样,您就不必开发SQL和写数据访问例程

我在做一个需要频繁访问数据库、插入和删除的项目。我应该使用原始SQL命令,还是更喜欢使用ORM技术?没有任何对象,仅使用SQL命令,项目就可以正常工作?这通常会影响可伸缩性吗


编辑:项目是其中一种类型,其中用户不提供“我的内容”,但用户生成内容,并且项目处于联机状态。因此,内容的数量取决于用户的数量,如果项目有50000个用户,而且每个用户都可以创建内容或阅读内容,那么最合适的方法是什么?

对于开发速度,我会选择ORM,特别是如果大多数数据访问都是CRUD

这样,您就不必开发SQL和写数据访问例程


可伸缩性应该不会受到影响,尽管您确实需要了解自己在做什么(原始SQL也可能会损害可伸缩性)。

我始终建议在数据访问层使用某种形式的ORM,因为在安全方面投入了大量时间。只有这一点,你才有理由不采用自己的方法,除非你对自己防范SQL注入和其他漏洞的技能有信心

如果项目是定向的: -数据编辑(如查看并编辑简单的数据表) -性能(如设计完成简单任务的最快算法)

然后可以在代码中使用直接sql命令

你不想做的事情是,如果这是一个大型软件,你会得到很多类和大量代码。如果您在这种情况下,并且将sql分散在代码中的任何地方,那么有一天您肯定会后悔的。您将很难更改域模型。任何修改都将变得非常困难(除了添加与现有功能或实体无关的功能或实体)

不过,更多的信息会更好,如: -你说的频繁(多频繁)是什么意思? -您需要什么性能

编辑

看起来你在做一些CMS服务。我打赌你不想开始用SQL填充你的代码@teresko的模式建议似乎很有趣,它将应用程序逻辑与数据库分开(这总是好的),但提供了定制每个查询的可能性。尽管如此,添加一个填充内存对象的层可能比简单地使用数据库结果来编写页面需要更多的时间,但我认为在您的情况下,这一微小的差异并不重要


我建议选择一个好的模式,将您的业务逻辑和数据访问分开,就像@terekso建议的那样

我认为最好是尽可能以最简单的方式实现目标。 如果使用ORM没有真正的附加优势,并且应用程序相当简单,那么我不会使用ORM。 如果应用程序真的是处理大型数据集,并且没有业务逻辑,那么我不会使用ORM

这并不意味着你不应该设计你的应用程序属性,但是,再说一次:如果使用ORM不能给你带来任何好处,那么你为什么要使用它呢?

如果你没有(或有限)使用ORM的经验,那么学习新的API就需要时间。另外,你必须记住,为了“魔法”牺牲速度。例如,大多数ORM将为字段选择通配符“*”,即使您只需要从
文章
表中获取标题列表

而且,在特殊情况下,ORM总是会失败

从OOP的角度来看,大多数的ORM(基于ActiveRecord模式的)都有严重的缺陷。它们在数据库结构和类/模型之间创建了紧密耦合

您可以将ORMs视为。这将使项目的开始更容易。但是,随着代码变得越来越复杂,您将开始遇到越来越多的问题,这些问题是由ORM API中的限制引起的。最终,您会遇到这样的情况,即无法使用ORM执行某些操作,您必须开始直接编写SQL片段和entires语句


我建议远离ORMs,在代码中实现一个模式。这将使您在域对象和数据库访问层之间实现分离。

这取决于时间尺度以及您当前对MySQL和ORM系统的了解。如果你没有太多时间,就做你最了解的事情,而不是浪费时间学习一整套新的代码

随着时间的推移,像Doctrine或Propel这样的ORM系统可以极大地提高您的开发速度。当模式仍在大量更改时,您不希望花费大量时间来重写查询。对于ORM系统,它可以像更改模式文件和清除缓存一样简单

然后,在设计完成后,关注性能。如果您确实使用ORM,并且您的代码是可靠的OOP,那么一次迁移到SQL查询并不是一个太大的问题


这就是使用OOP编码的好处——这样的决定不必永远束缚着你。

如果CRUD访问非常频繁,而我有一个非常大的数据库,该怎么办?ORM不是一个占用内存的人吗?我相信即使是缓存也不会有用(如果我错了请纠正我).@c0da-这取决于格式,但通常情况下,它们会有助于提高性能。@Oded我已经编辑了我的问题,请检查一下,现在回答。。。我很感激…@c0da-我的答案没有改变:)@Oded我注意到你在之前的评论中通常使用这个词。。。这意味着什么?让我们假设我能够很好地管理安全透视图。。。那么,原始SQL就可以正常工作了?一方面(正如在上面的评论中指出的那样),ORM为我提供了缓存和简单的可伸缩性(如果要实现可伸缩性,我将不得不编写越来越少的代码)。但另一方面,如果