在敏捷开发中,我应该在数据库之前尝试在平面文件中进行持久化吗?


21

有人向我解释说,由于在敏捷开发中,策略和应用程序逻辑应该比持久性方法之类的细节更为重要,因此持久性决策应该在最后做出。因此,从简单的持久性(例如平面文件)开始可能是一个好主意,直​​到我们意识到该方法的弱点显而易见,然后才更改持久性(例如,使用关系数据库)。

这是真的吗?还是我误解了这个概念?这是敏捷团队通常如何构建应用程序吗?有什么理由?何时不应该采用这种方法?


1
持久性逻辑不是次要细节的一部分,或者不那么重要。那一定是第一个决定。您需要持久性结构的ACID属性。该决定不能搁置。
Manoj R

Answers:


42

传达的概念绝对是敏捷和相关的一部分,是将事情推到最后负责任时刻的想法。

但是,所采用的示例实际上是基于一个完全错误的假设开始的:

与使用RDBMS相比,实现平面文件数据库要容易/省力。- 通常完全错误

该示例应为:将持久层保留为最简单的可能实现,直到做出不足的决定。

对于许多开发团队来说,让数据库站起来进行此操作大约需要一两个小时(对于使用ORM的小型数据库而言,则需要15分钟),而他们不需要继续使用的平面文件数据库可能只是一个小问题。巨大的痛苦和烦恼,因为当数据库可能像在UI中创建表,添加几列然后让ORM生成所有内容一样简单时,它们必须手动手写所有寻求和数据表构造类型代码否则你需要。

此外,如果您不知道持久层是如何开始的,那么从团队熟悉的通用RDBMS开始,这是更合适的举动,因为以后从平面文件到RDBMS的更改要大得多。从一个RDBMS更改为另一个。有很多工具可以将大多数常见的RDBMS转换为其他类似的工具,技巧和提示,因为这是一条行之有效的路径。从平面文件转换为任何给定的RDBMS的工具很少,在这些文件中,平面文件具有某些专有格式,而除了您自己的库以外,以前还没有编写过该工具。

总结: 这个概念是正确和准确的,但是该示例基于一个非常大且经常(几乎总是)不正确的假设


6
而且您非常大的假设是,他们必须手动编写所有搜索和数据表构造类型代码!:-)通常,当您使用平面文件时,首先使用语言的内置序列化格式(例如Ruby中的Marshal或Cocoa / Objective-C中的NSKeyedArchiver),然后转储一些现有的内部对象。只要您的应用程序不必太频繁地重新加载,并且只要您能够掌握应用程序各个版本之间的架构更改,该技术就可以长时间有效地工作,特别是在开发过程中。
Alex Chaffee 2013年

@AlexChaffee公平点,但是无论是哪种方式,您都需要以某种方式围绕此东西编写一些代码,或者现代ORM使这件事在RDBMS或NoSQL上做到这一点在琐碎上相当相等,这对团队的影响是基于团队技能的知识比什么都重要,我只是认为这是一个不好的例子,无法说明其原因。我个人使用MSSQL已有13年了,但由于简单起见,在ACID变得重要之前,它不会使MongoDB持久化,因为这样做很简单。
2013年

17

既然您知道您将使用数据库,那么编写代码来处理平面文件并没有多大意义。您可能会使用一些只读CSV进行几次迭代,但是您会很快发现自己编写了知道会扔掉的代码。

您可以通过使用SQLite之类的东西来简化初始复杂性,SQLite是一种类似SQLite的库,它使您可以将无服务器的SQL数据库存储在文件中。它具有灵活的类型系统,因此您不必认真地提交架构,没有服务器可以配置/连接并重建数据库,就像删除文件一样简单。如果需要,它还允许您简单地将DB映像以及代码包含在版本控制中。


4
似乎您受到了平面文件协会的反对。
JeffO

@JeffO:SQLite将其数据库保存到平面文件中。
Mindor先生,

7
@Mindor先生,大多数数据库都可以...但是那无关紧要。这里的“平面文件”是指直接操作文件,而不是通过某些数据库层。
GrandmasterB

不同意。我仍然需要学习SQLite的工作原理,并实现在.NET中操纵SQLite数据库,将查询结果转换为对象等的代码,以免开发变得更容易。它只是增加了创建数据库的所有负担,而没有完善的数据库服务器的优势。
Louis Rhys

11

这是一个示例,用于演示概念,而不是概念本身。

这个概念是,您直到最后一个负责任的时刻才做出架构决定,但不要迟到。但是,实际上,您经常会对要在很早使用的数据库做出决定。那可能并不完美,但这是事实。

一旦做出决定,您就不会积极回避它。在现有数据库中存储内容通常与将其存储在平面文件中一样容易。

但是,从Linux上的MySql更改为Windows上的SQL Server可能不像从任何地方的平面文件更改为Windows上的SQL Server一样简单。这才是真正的重点。因此,尽管对最终解决方案存有疑问,但应采取最简单的选择,以应对变化。做出决定后,请坚持下去。


我不同意迁移路径。technet.microsoft.com/zh-cn/library/cc966396.aspx提供了有关从MySQL迁移到MSSQL的详细说明,尽管要将平面文件转换为这两种选择都需要在SSIS或MySQL版本中手动编写一些ETL。
Jimmy Hoffa

@JimmyHoffa:我不知道,CSV很简单。blog.sqlauthority.com/2008/02/06/... tech-recipes.com/rx/2345/import_csv_file_directly_into_mysql但我同意你的观点,无论是路径是复杂的。
pdr

6

什么是你坚持?

我在一个敏捷团队中,对于一个应用程序,我们几乎将所有内容都保存到数据库中。请注意,如果不这样做的话,此应用程序将无法做很多事情-将事情持久化到数据库是其存在的很大一部分。

所以:您坚持什么,您的应用程序做什么?如果应用程序实际上并不关心其数据在何处持久化,那么您可以编写一小层来决定平面文件与数据库的决定(该决定可以存储在某个配置文件中的某个位置)。我认为你需要评估你的应用程序和数据,并决定是否让您的特定情况下,感数据库持久投入时间,或者只是读/写平面文件(这可能是更快的开发时间方面)。


1
该应用程序管理一个请求队列,并且在关闭并重新启动后需要记住该队列。.没有义务像在您的应用程序中那样使用数据库
Louis Rhys

@LouisRhys:此队列数据将如何处理?只是阅读并显示给用户?您认为从数据库中持久保存会有什么好处?
FrustratedWithFormsDesigner

队列中的动作将被执行。数据库的好处包括性能,并发管理,并且客户端可能还会关心安全性,可读性和数据查询。
Louis Rhys

@LouisRhys:也许在开发的第一个迭代或两个迭代中,您可以使用一个平面文件,只是为了使概念验证正常工作,但是您可能希望将逻辑与数据访问完全分开,因为将来会听起来像数据库可能是一件好事(并且从文件更改为db将需要更多时间)。归根结底,这是一项高级架构决策,只有您才能做出,因为您可以访问客户的规格/要求。
FrustratedWithFormsDesigner

5

许多人将敏捷性这一方面误解为意味着他们不应该为未来的功能提前计划。没有东西会离事实很远。您不需要做的就是允许计划将来的功能,以延迟现在为客户提供价值。

它如何适用于诸如持久性之类的东西在很大程度上取决于您的应用程序。我目前的爱好项目之一是计算器。最终,我希望能够存储用户定义的常量和函数,并在关闭程序时保存状态。这需要持久性,但我什至还没有开始考虑采用哪种形式。我的程序在没有持久性的情况下将非常有用,并且现在添加它会大大延迟我的第一个发行版。我希望有一个工作正常的计算器,其功能比根本没有的功能少,而我等待它变得完美。

我的另一个爱好项目是视频和照片色彩校正。如果无法保存正在进行的工作,此应用程序将完全无法使用,并且这样做所需的代码遍及整个程序。如果我从一开始就做不好,那么更改它可能会非常困难,因此我在持久性方面花了很多精力。

大多数项目都介于两者之间,但是如果您现在几乎不需要付出额外的努力,就永远不要为将来的功能计划而感到沮丧。数据库可能很复杂,但是大多数复杂性都隐藏在可靠的,经过良好测试的界面后面。对于数据库来说,您要做的工作可能要比平面文件少得多,因为数据库免费为您提供了所有功能。如果您还不想处理数据库服务器的麻烦,可以使用像SQLite这样的“混合”选项。


1
“计划没有用,但是计划是必不可少的。” -艾森豪威尔
Alex Chaffee 2013年

3

我认为您正在将重点放在错误的价值观上。在敏捷中,业务价值是重点。您创建产品是为了向某些最终用户提供业务价值。

如果您创建持久层或在后期进行创建,那么这就是向客户交付业务价值的策略。我认为,“敏捷”一词本身并不能决定您应该选择其中一项。

罗伯特·C·马丁(敏捷宣言的作者之一)在本演讲中提出了关于推迟数据存储策略的观点。

这是一个很好的演示,我建议您观看。

但我不同意!至少在一定程度上。

我不认为您可以将用户故事称为“完成”,如果该用户故事涉及应保留的数据,并且您实际上没有实现任何类型的持久性。

如果产品负责人认为现在该上线了,那您将无法这样做。而且,如果您直到项目后期才开始实施持久性,那么您也将没有有关实现持久性层所需时间的信息,这将给项目带来重大风险。

我从事的敏捷项目并未推迟数据访问策略。但是它已经解耦了,允许我们在此过程中进行更改。整个数据库架构并不是预先设计的。为了实现用户存储的表和列,它们将按照需要的方式进行创建,最终实现业务价值。


1

需要良好的判断力和经验,才能知道在开始新项目时首先要回答什么问题。

如果最终产品还是未知的,那么快速构建/制作原型将很好地帮助您解决这一问题,是的,以敏捷的方式进行迭代将有所帮助。这当然会带来风险,例如发现在过程的后期,持久性实现所花费的时间将比您传达给利益相关者的时间更长。

如果最终产品是众所周知的,那么了解持久性将如何在您的应用程序中工作可能更重要。风险在于在开发过程的后期发现产品规格问题。


0

平面文件并不简单!

它们允许存储,仅此而已。数据的结构,访问路径等全由您决定,并且有很多方法可以解决此问题。

存在数据库的原因有一个,其中之一就是使开发人员更轻松。

我的大部分开发工作都是为大型公司的大型系统完成的。在进行任何进一步的设计或开发之前,我们始终拥有完整且经过深思熟虑的数据模型。数据模型可帮助您了解问题并允许执行整洁。

通过提前生成数据模型,可以避免遗忘的数据项,不匹配的数据结构和其他噩梦。

您可以保留数据库技术的实际选择,直到出现数据模型为止。但是大多数“持久性”技术都是紧密结合的编程甚至设计风格。如果您为关系数据库编写代码,后来又决定切换到多云键值,那么您将需要完全重新编写一半的代码。

如果您从平面文件开始并切换到关系数据库,您可能最终会丢掉一半的代码,因为开发人员会浪费时间来实现糟糕的数据库。


-1

您是否应该在数据库之前在平面文件中尝试持久性?

是的,您应该尝试一下。特别是如果您从未尝试过。无论结果如何,您都会学到一些东西。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.