代码优先与数据库优先


77

在设计和创建要使用的软件时,通常会先设计和创建后端SQL表,然后再进行实际编程。我目前正在从事的项目让我感到困惑。这可能是由于缺乏良好而可靠的要求所致,但是不幸的是,这次我对此几乎无能为力。这是一种“随它去吧”的情况,但是我离题了。

我正在考虑将工作流程从头开始,并首先创建UI和数据模型类,以期解决该问题将使我清楚我的数据库架构最终将是什么样。这是一个好主意吗?我很担心自己最终将获得一个UI,但仍然不知道如何构造数据库。

如果有人好奇,我将SQL Server用作后端,将MS Access用作前端应用程序。(访问也不是我的选择...所以请不要对此感到讨厌。)



6
@gnat:完全不同。
罗伯特·哈维

1
如果作为重复项被关闭,那么它应该是这个问题的重复项。答案和问题更符合我的要求。
RubberDuck

1
@Mawg这是一个工作项目。我已尽全力推迟确定要求。必须从此开始工作,对此我无能为力。
RubberDuck

4
Errrm,新工作?我知道我会的。但是,作为一名30年的自由职业者,我发现很容易在真正受到关注之前就走开(有些人您根本无法帮助),但是我意识到这并不是所有人都那么容易。在该地区等),但是如果它开始影响您就不要留下来
Mawg 2014年

Answers:


85

首先是流程,还是流程使用的数据?我知道这是一个“鸡还是蛋”的问题,但是对于软件来说,我相信这是一个过程。

例如,您可以一次仅实现一个内存持久性(或任何易于实现的)来实现一个用例,从而逐步建立数据模型。当您感觉到已经实现了足够的用例来概述基本实体时,可以用真实的数据库替换内存中的持久性,然后继续进行改进,一次只使用一个用例。

这将焦点从数据库中移出,并将其移至问题的核心:业务规则。如果从实施业务规则开始,那么最终(通过非常类似于Natural Selection的过程)将发现企业真正需要哪些数据。如果您从对数据库建模开始,却没有反馈到是否确实需要该数据(或采用这种格式,或处于那种规范化水平,等等...),那么您要么最终会在模式(如果业务已经在运行,则可能需要繁重的迁移过程),否则您将必须在业务规则中实现“变通方法”以弥补不合时宜的数据模型。

TL; DR:数据库取决于业务-由他们定义。除非您有一个处理该数据的流程(报告也是一个流程),否则您将不需要数据。首先实施该过程,然后您将找到所需的数据。首先对数据进行建模,当您首次对数据进行建模时,您也许可以计算出多少个错误的假设。

主题略有不同,但非常重要:我描述的工作流通常与非常重要的实践一起使用,例如“可能的最简单的事情”,测试驱动的开发以及着重于将架构与细节隔离开来。妨碍您(提示:数据库)。关于最后一个,这个演讲很好地总结了这个想法。


1
“数据库是一个细节”。非常感谢您的链接。我全心全意地相信,在观看了这次演讲之后,我将能够解决这个项目,将数据库留作延迟的决定。
RubberDuck

6
只是在上面打个名字:这些实践都是敏捷开发中所有(可以说)重要的实践(增量开发,最简单的可行方法,测试驱动,用户首先需要...)。
sleske 2014年

8
我想回来并再次感谢您。我的整个中间层都没有数据库,现在我对如何持久存储数据有了很好的了解。我感激不尽。如果可以的话,我会再次投票。
RubberDuck

12
如果您通过代码优先方法真正地捕获了所有需求,并且在最终数据库中真正地表达了所有这些需求,那么我可以同意这个答案。但是我见过许多项目,对获得“有效”的满足感会导致一种态度,即“如果有效,数据库必须足够好”,即使这是一个可怕的数据库设计,也不可避免地存在严重的性能问题。后来。另外,很多人似乎认为如果代码正在验证数据,则不需要CHECK或FOREIGN KEY约束。你做
Ross Presser 2014年

2
视频中可能涵盖了这一点-不幸的是,我现在无法做到这一点-但增量方法的另一个优点是,如果操作正确,它将有助于巩固含糊的规格。“此屏幕看起来是否正在捕获您需要的所有联系信息?这些字段的排列顺序对您的工作流程是否有意义?” 能够提出这些问题(以具体的内容作为参考)是IME经常获得所需信息的唯一方法。
大卫

17

根本原因分析表明,此问题不是方法之一,而是缺乏规范。没有一个,您首先写什么并不重要-无论如何您将把它扔掉。

帮自己一个忙,并进行一些基本的系统分析-确定各个级别的一些用户,填写一份快速且肮脏的调查表,然后关闭机器,喝上咖啡和饼干/甜甜圈(或任何油脂的轮子),然后步行到他们的办公桌,问他们做些什么,以及他们需要知道/记录什么才能完成工作,即使看起来很明显-仍然要问。不必担心它们有多重要,如果他们太忙了,那么可以安排下一次回来或与他们在一起。

一旦有了,您就应该能够开始构建您认为可以给您最好的结果的任何东西,并等待其余的规范出现。


我全心全意同意,但这不会在这一点上发生。谢谢您的宝贵时间。
RubberDuck

9
如果您没有时间做正确的事,那么您将在哪里找到时间来解决呢?
Walter Mitty 2014年

谁说过关于不正确@WalterMitty的事情?请查看已接受答案中的视频链接。该数据库是一个细节,无需使用该细节即可处理95%的软件中的问题。
RubberDuck

1
我认为“那将不会发生”是指您将甚至在不知道涉众需要系统提供哪些信息的情况下继续进行编码。我认为James在进行基本系统分析时会给您很好的建议,而不会陷入分析瘫痪的境地。
Walter Mitty 2014年

你误解了我@WalterMitty。我采用了反馈循环的方法。我将构建我认为应该的内容(没有数据库),然后将其带给用户。修改程序。重复。经过几次迭代,我应该确切知道数据库的外观。据我了解,敏捷方法是专门为应对不清楚的需求而设计的。在这个项目上,我觉得很好。
RubberDuck

12

我的经验如下:

  • 在我从事的大多数项目中,我们首先设计数据库。
  • 通常,数据已经存在于电子表格,旧式数据库,纸张等中。这些数据将为您提供有关保存数据表的提示。
  • 通常情况下,一个过程已经被使用,但是却是手动的,或者使用了几种不同的工具,这些工具不是自动化的,互操作的和/或不符合标准的。
  • 一旦有了半成熟的数据库模型,就可以开始设计可读写该数据库的原型表单,窗口等。
  • 随着您的继续,将需要进行一些更改以适应最初未考虑的情况。

还请记住:

  • 它不再是一个单应用程序<->一个数据库的世界。也许您的应用程序将不得不从多个数据库中读取或写入数据,或者您的解决方案将包含使用同一数据库的多个应用程序。

结论:我建议您首先设计数据库。


这些都是非常真实的东西,实际上,这替代“非过程”和电子表格,但是我看不到这如何回答我的问题。你能澄清一下吗?
RubberDuck

1
@RubberDuck我在回答的末尾添加了一个说明。
图兰斯·科尔多瓦

11

我之所以说数据库优先,是因为我在大型项目方面有很多经验,如果您有许多并行工作的开发人员,那么您确实需要一个可靠的数据模型。

但是后来我对此进行了更多了解,我意识到在更成功的大型项目上我们真正要做的是“需求至上”。

一组明确规定的良好业务需求会导致一系列良好的功能需求。如果您有很好的功能需求,那么数据模型和模块规格就可以轻松投入使用。


这正是我通常的工作方式。首先要求,是的。我多么希望现在可以将某些坚实的要求从某个人中删除。
RubberDuck

首先是需求,尽管您不应该等到需求完成(从来没有)。一旦有足够的能力去了解应用程序的目标是什么,那就开始吧,然后在需要时得到更多。
sleske 2014年

@sleske-好的分析师应该对需求的“动态”部分(即模糊和可变的部分)有所了解,并在设计中建立一定的灵活性,以轻松应对用户的需求。
James Anderson

1
@JamesAnderson:其实,我的敏捷开发的原则,在这里你通常只为您设计所需要的庞大的球迷现在,除非你知道你不能在以后更改设计(很少的情况下)。但是我开始变得
没意思了

8

由于这似乎很不确定/不确定,所以我首先要做前端GUI-听起来您需要从涉众那里获得响应,支持,时间和反馈,对吗?他们不在乎您出色的规范化表,外键约束和级联删除。但是很酷的GUI带有很多闪亮的颜色-嗯,这是一流的!

对于最初的后端“数据库”,请使用非常简单的方法,也许只是将键/值存储到文件中。我不熟悉MS Access,所以不知道“最轻量”的后端是什么。(一张铺有桌子的桌子?)不管是快速还是肮脏的,都要计划将其扔掉。

如果可以的话,请在GUI中使用有趣的外观,以明确它是原型。如果所有其他方法均失败,请使用索引卡。

现在,也许您的利益相关者是数据库专家-有时我就是这种情况!-在这种情况下,请进行一些数据库设计。


3
+1既不是“代码优先”也不是“数据库优先”,而是“非功能性gui原型优先”(也称为“快速原型”),因为gui原型在没有需求的情况下有助于与最终用户明确需求。
k3b 2014年

1
是的,但这也使他们相信该应用程序的性能和完成度一样好。在此之前,我一直很
生气

@Mawg是的,不幸的是,这是一种危险。一种选择(至少在Java中是)是使用怪异的“外观”来明确表明这是一个原型。
user949300 2014年

如果您不知道要去哪里,任何代码都可以带您到那里。

-1

由于要求不明确,因此可以从一个非常初级的数据模型开始,其中包含您将知道需要的关键元素,也许只是基本表和PK。其余数据序列化为二进制或XML,然后将BLOB存储在数据库中。这应该允许人们在没有完全关系模型的情况下开发UI和业务层(中间层),但是您仍将具有保存和检索持久性以及根据需要进行简单键查找的持久性。

例如,也许您有一个人物,所以您有一个人物ID的PK。其余的属性未知,因此仅从带有PK Person ID的Person表开始,该表将存储Blob和所有person数据。

需求确定之后,请使用您的Blob并提取所有需要的表和列,并使模型具有关联性。然后,只需将持久性从BLOB更改为数据访问层中的关系即可。但是其他所有内容,业务规则UI等仍然可以使用。注意,这会增加项目时间,但可以完全灵活地根据需要添加和删除事物,而无需更改关系模型,直到事物变得更牢固为止

由于无法查询BLOB,因此搜索可能会延迟,因此随着模型的稳定,请开始将需要搜索的数据存储在关系列中。

基本上,您从表格模型开始,然后随着项目的进展移至关系模型。

或者,在开始任何工作之前确定需求,以便可以最初开发关系模型。


这种疯狂的谎言。在准备好持久存储数据之前,请不要持久存储数据。在事实噩梦之后对数据进行规范化。
RubberDuck

1
持久性和规范化之间是有区别的。只有您能回答的问题是我是否只需要坚持,或者坚持和规范化。数据模型是一个模型,如果没有要求,则很难对它们进行关联建模。
乔恩·雷诺2014年

-2

一般来说,我认为代码紧随数据之后,因为代码将操纵数据。

如果需求不明确,则可以创建一个解释需求的数据模型。最好的办法是写下一些要求,然后将其发送给您的雇主,然后他们可以提出一些建议。还是先创建一个GUI,这取决于雇主的类型,什么才最有效:)


3
这似乎并没有提供任何对先前5个答案提出和解释的观点的实质性建议
gnat 2014年

我的观点是根据客户端的类型遵循的方法
KEIN IhpleD
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.