首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建表,如果不存在,每次API调用:不良实践?

创建表,如果不存在,每次API调用:不良实践?
EN

Database Administration用户
提问于 2017-03-13 08:52:58
回答 2查看 1.5K关注 0票数 5

我正在用PHP编写一个简单的API,并将MySQL作为web应用程序的数据库。我打算为每个API调用中的所有表设置CREATE TABLE IF NOT EXIST

我想我会有5-6张桌子。

我尝试这样做有一个简单的原因:我将不需要任何额外的脚本来运行应用程序的初始化-它将自动在第一次运行。

作为一个缺点,我希望这可以减缓API操作。但是,我尝试记录API调用,它仍然是2-3毫秒(在我的例子中,如果存在CREATE,我没有注意到任何不同)。

有什么想法吗?

EN

回答 2

Database Administration用户

发布于 2017-03-13 10:30:51

所以让我们向前想一想。应用程序启动,表被创建,一切都很美好。然后,您将有一个新的需求,并且表必须更改。你是怎么编码的?这是为代码从未运行的环境创建的,另外还有一些针对现有环境的更改。现在又出现了另一个要求。这一次,由于某种原因,您必须迁移数据。现在有了创建(针对新环境)、更改(针对现有环境)以及大量DDL和迁移逻辑。但是等等-还有更多。出于非常好的业务原因,您希望保存迁移数据的列具有与现有列相同的名称。现在如何判断数据库是否已被迁移?不再有元数据查询。不,现在您需要一个标志或版本表来显示DDL在每次执行时必须运行的内容。

嗯!你是一个伟大的成功。成千上万的人想要使用你的服务。风险资本家把一大笔钱推到你家门口。第三方组织正在乞求与你合作。开发团队翻了一番(不,翻了三倍!)在规模上处理商业机会和定制。糟了。这些都必须在API启动代码中进行编码。每个人。和。每个。一。您已经没有API了。您拥有所有迁移脚本的之母,并添加了一个业务代码片段。*悲伤的表情:

票数 4
EN

Database Administration用户

发布于 2017-07-08 09:55:42

我在寻找同样原因的开销信息。可能没有开销,因为表通常是缓存的,并且没有磁盘访问。数据库的瓶颈通常是磁盘访问。然而,一个更好的解决方案可能有以下特性:

  1. 必须有版本表才能跟踪数据库版本。如果你不这样做,总有一天你会有麻烦的。
  2. 您必须对上一个版本的每个版本具有迁移脚本/函数,并列出所有已发布的版本,这样您就可以从当前的数据库版本以相同的顺序运行它们,直到api版本。
  3. 可以有一个主迁移脚本来调用每个版本的脚本。这个脚本可以在目标应用程序测试中运行,而不是在api调用中运行。在我看来,在没有监视的情况下更新数据库是个坏主意。一个好的应用程序将有一些测试--例如单元测试、selenium等等。
  4. 迟早,您将无法自动更新数据库,因为您已经插入了新的列/表,这些列/表无法填充默认值,并且需要数据。这就是为什么更新必须被监控。您抛出了一个非常具有描述性的异常,它说明了必须完成的工作,并提供了一个指向文档的链接,并提供了更详细的迁移过程描述。应用程序开发人员制作一个迁移脚本,运行它,然后再运行API迁移脚本。
  5. 因为在4中描述的手动步骤可能需要位于迁移脚本的中间,所以每个迁移脚本都可以有迁移步骤。迁移步骤可以写入版本表。这样,更新脚本就可以检查它是在什么阶段,在下一次运行时,它将检查手动步骤是否已经完成,并从它离开的地方继续。

听起来很复杂,但这就是编写API和编写应用程序之间的区别。除非您的应用程序必须安装在许多服务器上.

而且,如果您设计得很好,您将不必进入复杂的步骤。每个版本更新脚本都是一个步骤,主要是添加可能具有默认值的新表或字段。如果您设计得很好,那么大多数版本更新根本不需要更新数据库。

票数 4
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/166996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档