如何使它们在测试和生产环境之间保持同步?
当涉及到数据库表上的索引时,我的理念是它们是编写查询数据库的任何代码不可或缺的一部分。 如果不分析对索引的影响,则无法引入新查询或更改查询。
因此,我尽最大努力使索引在所有环境之间保持同步,但说实话,我在自动化方面做得不是很好。 这是一种随意的手动过程。
我定期查看索引统计信息并删除不必要的索引。 我通常通过创建一个删除脚本来执行此操作,然后将其复制回其他环境。
但是这里和那里的索引是在正常过程之外创建和删除的,很难看出差异在哪里。
我发现真正有帮助的一件事是使用简单的数字索引名称,例如
idx_t_01
idx_t_02
其中 t 是表的简短缩写。 当我尝试巧妙地处理所有涉及的列时,我发现索引维护是不可能的,例如,
idx_c1_c2_c5_c9_c3_c11_5
区分这样的索引太难了。
有没有人有真正好的方法将索引维护集成到源代码控制和开发生命周期中?
索引是数据库架构的一部分,因此应与其他所有内容一起进行源代码控制。没有人应该在没有经过正常的 QA 和发布过程(尤其是性能测试)的情况下四处创建生产索引。
关于架构版本控制还有许多其他线程。
数据库的完整架构应位于代码旁边的源代码管理中。当我说"完整架构"时,我指的是表定义、查询、存储过程、索引,等等。
执行全新安装时,您可以执行以下操作:- 查看产品的X版本。- 从签出的"数据库"目录中,运行数据库脚本以创建数据库。- 使用签出中的代码库与数据库进行交互。
在开发时,每个开发人员都应该使用自己的私有数据库实例。当他们进行架构更改时,他们会签入一组新的架构定义文件,这些文件针对其修订后的代码库工作。
使用此方法,您永远不会遇到代码库-数据库同步问题。
是的,任何 DML 或 DDL 更改都经过脚本编写并签入源代码管理,主要是通过 rails 中的 activerecord 迁移。我讨厌不断地嘟的号角,但是在构建基于数据库的系统的许多年中,我发现迁移路线比我使用或构建的任何本土系统都要好得多。
但是,我确实命名了我所有的索引(不要让DBMS想出它选择的任何疯狂名称)。不要为它们添加前缀,这很愚蠢(因为您在系统对象或您拥有的任何数据库中都有类型元数据),但我确实包括表名和列,例如tablename_col1_col2。
这样,如果我正在浏览系统对象,我可以轻松查看特定表的索引(这也是一种习惯的力量,在我使用的一些 dBMS 上,索引名称在整个数据库中都是唯一的,所以确保这一点的唯一方法是使用唯一的名称)。
我认为这里有两个问题:索引命名约定,以及将数据库更改添加到源代码管理/生命周期中。 我将解决后一个问题。
我做Java程序员已经有很长一段时间了,但最近被介绍到一个系统,该系统使用Ruby on Rails对系统的一部分进行数据库访问。 我喜欢RoR的一件事是"迁移"的概念。 基本上,你有一个目录,里面装满了看起来像001_add_foo_table.rb、002_add_bar_table.rb、003_add_blah_column_to_foo.rb等的文件。 这些 Ruby 源文件扩展了父类,覆盖了名为"up"和"down"的方法。 "up"方法包含将以前版本的数据库架构恢复到当前版本所需的一组数据库更改。 同样,"down"方法将更改恢复到以前的版本。 当您要为特定版本设置架构时,Rails 迁移脚本会检查数据库以查看当前版本是什么,然后找到 .rb 文件,这些文件可以让您从那里向上(或向下)到所需的修订版。
若要将此作为开发过程的一部分,可以将这些内容签入源代码管理,并调味。
这里没有什么关于Rails的具体或特别之处,只是这是我第一次看到这种技术被广泛使用。 您可能也可以使用成对的 SQL DDL 文件,例如 001_UP_add_foo_table.sql 和 001_DOWN_remove_foo_table.sql。 剩下的就是 shell 脚本的小问题,留给读者的练习。
我总是源代码控制SQL(DDL,DML等)。 它的代码与其他任何代码一样。 它的良好做法。
我不确定索引在不同的环境中是否应该相同,因为它们具有不同的数据大小。除非测试和生产环境具有完全相同的数据,否则索引将有所不同。
至于它们是否属于源代码管理,我不太确定。
我不把我的索引放在源代码管理中,而是把索引的创建脚本放在源代码管理中。
索引命名:
- "
- 客户"表中"名称"字段的IX_CUSTOMER_NAME
- PK_CUSTOMER_ID为主键,
- UI_CUSTOMER_GUID,对于客户的 GUID 字段是唯一的(因此"UI" - 唯一索引)。
在我当前的项目中,我在源代码管理中有两个东西 - 空数据库的完整转储(使用 pg_dump -c,因此它具有创建表和索引的所有 ddl)和一个脚本,该脚本确定您拥有的数据库版本,并应用更改/删除/添加以使其达到当前版本。 前者在我们在新站点上安装时运行,也在 QA 开始新一轮测试时运行,后者在每次升级时运行。 进行数据库更改时,需要更新这两个文件。
使用 grails 应用程序,索引默认存储在源代码管理中,因为您要在表示域对象的文件中定义索引定义。 仅供参考,仅提供"圣杯"视角。