Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 良好的数据层开发与维护;设计:数据层开发中常见的错误做法是什么?_Database_Orm_Command Query Separation_Data Tier Applications - Fatal编程技术网

Database 良好的数据层开发与维护;设计:数据层开发中常见的错误做法是什么?

Database 良好的数据层开发与维护;设计:数据层开发中常见的错误做法是什么?,database,orm,command-query-separation,data-tier-applications,Database,Orm,Command Query Separation,Data Tier Applications,我目前正在研究高可维护系统的应用程序设计的最佳实践(在相当高的水平上),这将导致最小的更改摩擦。“数据层”指的是数据库设计、对象关系映射器(ORM)和通用数据访问技术 根据您的经验,在数据层开发方面,您发现了哪些常见错误和不好的做法,您采取了哪些措施/实施了哪些措施/或可以推荐哪些措施,以使数据层成为开发人员心目中更好的地方 示例答案可能包括:导致数据层速度慢、可扩展性差和可扩展性差的最常见原因是什么?+可以采取什么措施(无论是在设计还是重构中)来解决这个问题 我在这里寻找战争故事和一些现实世界

我目前正在研究高可维护系统的应用程序设计的最佳实践(在相当高的水平上),这将导致最小的更改摩擦。“数据层”指的是数据库设计、对象关系映射器(ORM)和通用数据访问技术

根据您的经验,在数据层开发方面,您发现了哪些常见错误和不好的做法,您采取了哪些措施/实施了哪些措施/或可以推荐哪些措施,以使数据层成为开发人员心目中更好的地方

示例答案可能包括:导致数据层速度慢、可扩展性差和可扩展性差的最常见原因是什么?+可以采取什么措施(无论是在设计还是重构中)来解决这个问题

我在这里寻找战争故事和一些现实世界的建议,我可以将这些建议构建到公开的指导文档和示例中。

Magic

我使用了,它可以自动存储和从数据库中获取对象。它还支持延迟加载,因此只有在您请求时才从数据库检索相关对象。这有点神奇,我不明白


只要它能工作,这一切都能正常工作,但当它发生故障时,就不可能找到它。我认为当我们将Hibernate与相结合时出现了一个问题,即当我们的代码被执行时,对象还没有被Hibernate初始化。这个问题很难调试,因为Hibernate以如此神秘的方式工作。

对象关系映射是一种糟糕的做法。我的意思是,它倾向于生成只能松散地描述为“关系”的数据模式,因此它们的伸缩性差,数据完整性差

这是因为关系模式经过了规范化过程,而O-R映射的结果通常是作为数据库表实现的对象类。这些通常不会被规范化,而是为OO开发人员的即时便利而设计的

当然,在持久性数据需求最小的情况下,这并不重要

然而,我曾为一家航运公司工作,该公司通过收购其他几家公司而发展壮大,并使用面向对象方法将集成运营系统的开发(以取代其继承的各种特定于公司的系统)外包给一家公司,并使用O-R映射生成的数据模式。正在开发的系统的性能特征非常差,数据模式非常复杂,以至于航运公司在大约两年的开发之后——甚至在投入使用之前——就放弃了它


这是O-R映射的直接结果;模式中最糟糕的复杂性(以及由此产生的性能差)是由于存在仅作为OO设计过程工件创建的表——它们反映的是屏幕布局,而不是数据关系。

有趣的是,我认为magic对于快速应用程序开发非常有用,但正如你正确地指出的那样,当事情出了问题时,它们就会变成一场噩梦。原因:使用团队未完全理解的“神奇”抽象/框架,最初会提高生产率和相对简单,但后来在尝试执行更复杂的扩展时会导致额外的复杂性(因此包含AOP以注入可扩展性)。解决方案:尽可能保持低水平并保持简单/在将工具和框架添加到工具带之前,从内到外了解它们。在某种程度上,所有程序员都需要依赖他们不完全理解的组件。诀窍是在花在阅读组件和开始编写代码上的时间之间取得一个很好的平衡developers@JonoW:我不这么认为-这些问题(据我所知)是由缺乏正常化造成的,导致关系实体的碎片化和较差的数据完整性。我在其他O-R映射开发的模式中也看到了类似的结果(由于数据集较小且不太复杂,因此灾难性后果较少)。O-R映射也不是解决问题的神奇解决方案-它引入了各种隐藏的复杂性,并大量使用反射,因此,如果性能是一个因素,我不会使用它。也就是说,编写自己的代码生成器(或找到其他人)来从db模式生成数据层是很容易的。他们使用了哪种ORM将其强制转换为非标准化的db模式?这似乎很奇怪。如果你看一下最流行的ORM,Hibernate/NHibernate,db模式的设计仍然取决于开发人员,它当然可以很好地处理规范化模式。@JonoW:我不知道。我确实知道(以我的经验)OO开发人员似乎讨厌规范化。这可能是因为如果在对象模型中实现,它会损害模型,而如果在数据层中实现,它(显然)会使将对象更改迁移到数据层的过程变得更加复杂,或者完全不可行。