抖音技术能力大揭密!钜惠大礼、深度体验,尽在火山引擎增长沙龙,就等你来! 立即报名>> 了解详情
写点什么

Frans Bouma 认为代码先行的 ORM 是“愚蠢的”

2014 年 1 月 09 日

在使用 ORM 构建基于数据库的项目时,开发者可以选择是先设计数据库表,还是先设计类或抽象模型。为了展开讨论,我们先列出 Frans Bouma 的结论:代码先行的 ORM 是愚蠢的。

先写代码,比如实体类,与先设计表一样有问题,它们都需要反向工程来得到抽象实体定义,以创建“对方”的元素:对类进行反向工程得到抽象实体定义,然后创建表和映射,或对表进行反向工程得到类,然后创建映射,这两者是等价的。核心问题是,如果先设计类或表,就等于先得到了抽象实体定义的某个投影的最终结果:类不是从天上掉下来的,在决定了领域包含这样一个类型后,它就存在了。例如,一个“Customer”,包含给定的字段:Id、CompanyName、Address 等。

他还说道,

我知道“代码先行”的整个思想来源于开发者希望编写代码,用代码来思考,然后将对象持久化到数据库中。但事实是,你持久化到数据库的并不是对象,而是它们的内容,是实体的实例。而一个实体类的实例(即一个对象)则很有可能比实体的实例包含更多的数据,所以看似存储“对象”,实则无法覆盖对象。拿序列化一个对象来打比方,我们序列化的并不是对象,而是其数据的子集,得到的结果与源并不一定匹配。在将数据反序列化为 JavaScript 对象的时候,我们还能将它视为原始的.NET 对象吗?当然不能,它是对象内部的数据,可以存在于任何地方。

那么,当“对象”序列化成 JSON 时,数据被序列化,这没有异议。但当同样的对象序列化成表行时,对象作为一个整体被序列化,这不是更奇怪吗?如果你仍然坚信 ORM 就是持久化对象,那么另一个不使用 ORM 但使用相同数据库的应用程序,在将“对象”持久化为表行时会发生什么呢?这个应用程序(甚至可以用完全不同的语言编写)可以完全正常地读取和消费存储于表行中的实体实例,不需要知道你将其视为一个持久化的.NET 对象。因为让人惊奇的是,表行中的内容并不是持久化的对象,而是持久化的实体实例,一个抽象实体定义的实例,不是类定义的实例。

Reddit 用户 remy_porter 对这个问题有不同的看法

我认为真正糟糕的是 EF 中的模型先行(Model First)。我痛恨它强制你使用的 GUI 工具。

我最喜欢的方式是用代码先行来实现一种殊途同归的方案。我以最有意义的方式编写对象模型,再以最有意义的方式编写数据库模型,然后使用 FluentAPI 来让两者匹配。

不过我承认,我用这种方式只是漫无目的地抛出数据库对象图,因为我告诉过管理层这个应用应该使用 NoSQL,但他们却充耳不闻(该数据模型是存储不同结构的文档,但却要求用 SQL Server)。

Nishruu 倾向于将其用于测试,

没错,我通常使用 Fluent API 来映射已经设计好的数据库。

代码先行真正有用的场景,是用内存 SQLite DB 或某种 LocalDB 来快速进行集成或单元测试。然后可以为测试概括而快速地重新创建数据库结构。

NHibernate 就很好,能和内存 SQLite DB 很好地工作。EF 就不尽如人意了,使用 LocalDB 时只能通过 MDF 文件重新创建数据库架构(schema)。

InfoQ 邀请您阅读 Bouma 的完整吐槽,并发表您的观点。

原文英文链接: Frans Bouma Argues Code First O/R Mapping is “Silly”

2014 年 1 月 09 日 02:111806
用户头像

发布了 59 篇内容, 共 19.2 次阅读, 收获喜欢 3 次。

关注

评论

发布
暂无评论
发现更多内容

架构师训练营 - 第三周总结

teslə

极客时间 - 架构师培训 -3 期作业

Damon

架构师训练营 - 第 02 周学习总结

Eric

Go:使用Delve和Core Dump来调试

陈思敏捷

go golang debug gdb

代码重构-学习总结

飞雪

组合设计模式

Karl

技术学习进阶(死磕法)

dudu

学习 技术

十万同时在线用户,需要多少内存?——Newbe.Claptrap 框架水平扩展实验

newbe36524

架构师训练营第三周作业

CATTY

故障演练利器之ChaosBlade介绍

心平气和

故障演练 故障注入

架构师训练营 - 学习笔记 - 第三周

心在飞

极客大学架构师训练营

Prometheus 2.19.0 新特性

耳东

Prometheus

springboot整合Quartz实现定时任务(api使用篇)

北漂码农有话说

Open-Falcon安装注意事项

wong

Open-Falcon Nightingale Monitor

ARTS-WEEK3

Allen

第三周总结

Karl

week3.学习总结

个人练习生niki👍

还有比二分查找更快的算法,面向接口编程Protocol,John 易筋 ARTS 打卡 Week 05

John(易筋)

swift ARTS 打卡计划 二分查找 binary search protocol

极客时间架构师训练营 - week3 - 作业 2

jjn0703

极客大学架构师训练营

架构师训练营 - 第三周作业

teslə

手写单例

Karl

week3 学习总结

任小龙

week3.课后作业

个人练习生niki👍

单例模式 组合模式

游戏夜读 | 《FPS关卡设计》

game1night

架构师训练营-第 03 周总结

Eric

极客大学架构师训练营

设计模式练习及感想(训练营第三课)

看山是山

设计模式 极客大学架构师训练营

三周作业

飞雪

ARTS-WEEK4

一周思进

ARTS 打卡计划

每周学习总结 - 架构师培训 3 期

Damon

架构师训练营-第 02 周作业

Eric

程序员的晚餐 | 6 月 21 日 自制小火锅

清远

美食

Study Go: From Zero to Hero

Study Go: From Zero to Hero

Frans Bouma认为代码先行的ORM是“愚蠢的”-InfoQ