1

我正在开发一个非常依赖数据库驱动的网络应用程序。我即将发布初始版本,因此我已锁定此版本的功能,但在发布后将实施许多其他功能。这些功能不可避免地需要对数据库模型进行一些修改,因此我担心在每个版本中迁移数据库的复杂性。我想知道的是,我应该在多大程度上关注现在锁定一个可靠的数据库设计以便我可以快速发布,而不是现在尝试预测某些功能以便我可以在发布之前将其构建到数据库中?我也预计会发现我当前模型的缺陷,然后可能想要对其进行更改,但如果我发布应用程序然后数据开始进入,我想迁移数据将是一项艰巨的任务。是否有解决此类问题的常规方法?指向正确方向的点将非常有用。

对于一些背景知识,我正在为 CG 制作管道开发资产管理系统。如此多的数据,它们之间有很多联系。它是基于网络的,完全用 Python 编写,它使用带有 SQLite 引擎的 SQLAlchemy。

4

2 回答 2

2

为生产应用程序管理数据库的一些想法:

  1. 每晚进行备份。这是至关重要的,因为如果您尝试进行更新(对数据或架构)并且您搞砸了,您将需要能够恢复到更稳定的东西。

  2. 创建环境。您应该拥有一个用于开发的本地数据库副本、一个供其他人在上线之前查看和测试的暂存数据库,当然还有一个您的实时系统指向的生产数据库。

  3. 在本地开始开发之前,请确保所有三个环境都同步。通过这种方式,您可以跟踪一段时间内的变化。

  4. 开始编写脚本并为它们发布版本。确保将它们存储在源代码控制系统(SVN、Git 等)中。您只需要更改历史记录以及需要在给定版本中运行的一小部分脚本。只是帮助您保持井井有条。

  5. 对本地数据库进行更改并进行测试。确保您有执行两件事的脚本,1) 修改数据或架构的脚本,2)撤消您所做工作的脚本,以防出现问题。在本地反复测试这些。运行脚本,测试然后回滚。事情还好吗?

  6. 在 staging 上运行脚本,看看是否一切正常。再次证明您的工作是好的,如果需要,您可以撤消更改。

  7. 一旦暂存良好并且您感到有信心,请在生产数据库上运行您的脚本。请记住,您有更改数据的脚本(更新、删除语句)和更改架构的脚本(添加字段、重命名字段、添加表)。

一般来说,慢慢来,在你的行动中非常谨慎。你越自律,你就会越自信。更新数据库可能很可怕,所以不要着急,写下你的行动计划,然后测试、测试、测试!

于 2013-01-16T18:03:42.727 回答
1

我看到(并且喜欢)的一种方法是一个名为的表versions,它只包含一个 id。

然后有updates.sql一个结构类似于这样的脚本:

DELIMITER $$

CREATE PROCEDURE IF NOT EXISTS DBUpdate()
BEGIN

IF (SELECT id FROM versions) = 1 THEN
  CREATE TABLE IF NOT EXISTS new_feature_table(
     id INT PRIMARY KEY AUTO-INCREMENT,
     blah VARCHAR(128) ...,
  );

IF (SELECT id FROM versions) = 2 THEN
  CREATE TABLE IF NOT EXISTS newer_feature_table(
     id INT PRIMARY KEY AUTO-INCREMENT,
     blah VARCHAR(128) ...,
  );

END$$

DELIMITER ;

CALL PROCEDURE DBUpdate();

然后,您编写一个 python 脚本来检查存储库的更新,连接到数据库,并通过此过程运行对模式的任何更改。这很好,因为您只需要一个versions具有适当 id 值的表来构建整个数据库(即没有数据;请参阅ryan1234关于数据备份的答案)。

于 2013-01-16T18:25:00.273 回答