大多数软件开发者都熟悉对象关系映射(ORM)。ORM是一种在面向对象的编程语言和数据库之间创建抽象层的编码技术。然而,虽然ORM有巨大价值,但它并非在所有场景下都是理想状态——特别是程序员对其价值有误解时。我们将揭露几个这样的误解,帮助你以正确方式使用ORM。
别误解了:我们很欣赏ORM。Redis热情地支持这一技术,并支持多种编程语言。但迈对第一步很重要。
最初,ORM作为连通不同系统的桥梁。ORM极大提升了灵活性,程序员能够选用他们喜欢的编程语言以简化通信,而非直接依赖于结构化查询语言(SQL)或者其他数据库特定的语言。由于系统通常依赖于不同的编程语言,存储数据方式也会不同,这就极大增加了复杂性。如果没有ORM,许多面向对象的程序将难以与数据库通信。
尽管如此,程序员可能会对ORM所扮演的角色产生误解,这会导致困惑,有时也会产生挫败感。
以下三个误解会妨碍你正确使用ORM,妨碍你从这项技术中获益。这是很遗憾的。
1. ORM混淆了与数据库的互动,所以你不需要了解SQL
想必你很熟悉SQL,它是关系型数据库中用于存储、操控和检索数据的标准化语言。与数据库交互时,你会使用特定的查询语句:INSERT,SELECT,UPDATE,DROP TABLE等等。
OMR帮助程序员使用他们倾向的语言(比如Python)与数据库交互,而不需要从头开始手动写入SQL查询语句。这是很重要的优势。借助ORM,可以将数据以结构化的方式建模,帮助程序员与数据库的布局和内容交互。
你无需使用SQL,因为ORM已经完成了大部分工作。ORM节省了时间和精力,特别是对于不了解SQL或对自己的技能缺乏信心的人群而言。StackOverflow 2020年的调查显示,全世界范围内只有56.9%的开发者使用SQL。但是捷径并不是无知的依据。一些开发者认为“我无需深入了解SQL”等同于“没必要学习数据库概念,因为ORM从头到尾把所有事都做好了”。
事实并非如此。
ORM对于简单的SQL查询助益良多。然而,你要执行一些复杂操作时,你需要知道SQL的功能,这样才能充分利用其全部功能。这应该不足为奇。其他开发工具也是如此。工具应该用于支撑我们的工作,而不是代替我们理解。
然而,开发者有时会把“我有帮助我的工具”概括为“如果你有一个工具,你无需了解任何关于数据库设计的内容”。高度抽象并不总是写出最好的代码。高度抽象很容易出错,而你需要了解SQL才能识别出这类情况。如果你不了解SQL,排障、性能调试或者整理复杂数据将会更加枯燥乏味。
了解SQL能让你更好地控制应用程序,让你能够调整SQL查询以优化性能。使用ORM帮你更高效工作——但并不能使你免于思考。
2. ORM提供的唯一功能是写SQL代码
一些反对ORM的人认为,最好是自己写SQL语句。他们认为ORM的唯一功能是写SQL代码。
但是ORM软件并不止步于写查询语句。ORM也涉及面向对象模型,以及数据如何在数据库和该模型间流动;这跟实际写SQL语句是正交关系。
ORM也提升了代码可维护性和复用性,因为ORM能够使开发者从对象角度,而非原子化数据碎片角度思考。
3. 如果你使用ORM,你无需担心数据库安全
SQL注入的后果是灾难性的,这会导致未授权的数据库接入。幸运的是,ORM在保护程序免受SQL注入攻击方面更为高效。ORM可以将对象和行动映射到数据库关联的代码,因此,你无需手动写入安全特定的代码。
然而,“它有助于”并不意味着“因此它是万无一失的”。ORM包并不能使你的数据库程序免于网络安全攻击。正如其他软件一样,ORM也有缺陷(即使是Hello World也容易遭受攻击),使数据驱动的程序暴露于攻击领域。
ORM首选的应对SQL注入攻击的防护方法是使用参数化查询。然而,并非所有ORM是以这种方式运行。在假设某一ORM是安全的之前,你至少应该确认它是如何把你的操作转化至SQL。
如果你是手动写代码,为了更好地保护程序安全,你应该部署所能利用的所有数据库安全技术。不管如何程序是如何创建的,要确保你的软件QA流程包含了完整的安全测试套装(并不仅限于SQL注入攻击)。ORM或许能降低安全漏洞的可能性,但最好保证安全。
Redis有ORM吗?
在Redis内部,我们对于任何能够使程序开发更加快速、精准、有效的工具都充满热情——这能够使程序员专注于思考如何以创新的方式使数据驱动型程序更好地服务用户。可以肯定的是,我们全力支持ORM。ORM提升了代码复用性,在数据接入层提供了简明的隔离。
Redis OM客户库介绍解释了对象映射器如何帮助你充分使用Redis模块。Redis OM的目标是提供高度抽象的工具箱,确保在你最熟悉的编程环境中轻松处理Redis数据。Redis OM包含4个高级别Redis客户库,我们诚邀您来探索:
原文标题:3 Common Misconceptions About Object-relational Mapping
原文作者:Will Johnston
原文链接:https://redis.com/blog/object-relational-mapping-misconceptions/




