3

以及如何使它们在测试和生产环境之间保持同步?

当谈到数据库表的索引时,我的理念是它们是编写任何查询数据库的代码的一个组成部分。如果不分析对索引的影响,就无法引入新查询或更改查询。

所以我尽我最大的努力让我的索引在我所有的环境之间保持同步,但老实说,我在自动化这方面做得不是很好。这是一种随意的手动过程。

我会定期查看索引统计数据并删除不必要的索引。我通常通过创建一个删除脚本来执行此操作,然后将其复制回其他环境。

但是这里和那里的索引是在正常过程之外创建和删除的,很难看出差异在哪里。

我发现真正有用的一件事是使用简单的数字索引名称,例如

idx_t_01
idx_t_02

其中 t 是表格的缩写。当我试图对所有涉及的列变得聪明时,我发现索引维护是不可能的,比如,

idx_c1_c2_c5_c9_c3_c11_5

区分这样的索引太难了。

有人有将索引维护集成到源代码控制和开发生命周期中的真正好方法吗?

4

9 回答 9

11

索引是数据库模式的一部分,因此应该与其他所有内容一起进行源代码控制。如果没有经过正常的 QA 和发布流程(尤其是性能测试),任何人都不应该在生产环境中创建索引。

关于模式版本控制还有许多其他线程。

于 2008-09-30T13:24:12.727 回答
6

数据库的完整架构应该在代码旁边的源代码控制中。当我说“完整模式”时,我指的是表定义、查询、存储过程、索引等等。

进行全新安装时,您可以: - 检查产品的 X 版本。- 从结帐的“数据库”目录中,运行数据库脚本来创建您的数据库。- 使用结帐中的代码库与数据库进行交互。

当您进行开发时,每个开发人员都应该针对他们自己的私有数据库实例工作。当他们进行模式更改时,他们会检查一组新的模式定义文件,这些文件适用于他们修改后的代码库。

使用这种方法,您永远不会遇到代码库-数据库同步问题。

于 2008-09-30T13:25:09.807 回答
5

是的,任何DML 或 DDL 更改都会编写脚本并签入源代码控制,主要是通过 rails 中的 activerecord 迁移。我讨厌不断地吹牛,但在构建基于 DB 的系统的多年中,我发现迁移路线比我使用或构建的任何本土系统都要好得多。

但是,我确实命名了我所有的索引(不要让 DBMS 想出它选择的任何疯狂的名称)。不要给它们加前缀,这很愚蠢(因为您在 sysobjects 或您拥有的任何数据库中都有类型元数据),但我确实包含了表名和列,例如 tablename_col1_col2。

这样,如果我正在浏览 sysobjects,我可以很容易地看到特定表的索引(这也是一种习惯的力量,在我使用的一些 dBMS 上,索引名称在整个数据库中都是唯一的,所以唯一的方法以确保使用唯一名称)。

于 2008-09-30T13:22:41.407 回答
1

我认为这里有两个问题:索引命名约定,以及将数据库更改添加到源代码控制/生命周期。我会解决后一个问题。

很长时间以来,我一直是一名 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 在这里并没有什么特别或特别之处,只是我第一次看到这种技术被广泛使用。您也可以使用成对的 SQL DDL 文件,例如 001_UP_add_foo_table.sql 和 001_DOWN_remove_foo_table.sql。剩下的就是关于 shell 脚本的小事,留给读者的练习。

于 2008-09-30T13:30:55.100 回答
0

我没有将我的索引放在源代码管理中,而是将索引的创建脚本。;-)

索引命名:

  • IX_CUSTOMER_NAME 用于表“客户”中的字段“名称”
  • PK_CUSTOMER_ID 为主键,
  • UI_CUSTOMER_GUID,用于唯一的客户 GUID 字段(因此是“UI” - 唯一索引)。
于 2008-09-30T13:24:25.007 回答
0

我总是对 SQL 进行源代码控制(DDL、DML 等)。它的代码和其他代码一样。它的好习惯。

于 2008-09-30T13:25:17.110 回答
0

我不确定索引在不同环境中是否应该相同,因为它们具有不同的数据大小。除非您的测试和生产环境具有相同的确切数据,否则索引会有所不同。

至于它们是否属于源代码控制,我不确定。

于 2008-09-30T13:26:03.237 回答
0

在我当前的项目中,我在源代码控制中有两件事 - 一个空数据库的完整转储(使用 pg_dump -c 所以它具有创建表和索引的所有 ddl)和一个确定您拥有的数据库版本的脚本,并应用更改/删除/添加以将其升级到当前版本。前者在我们在新站点上安装时运行,并且在 QA 开始新一轮测试时运行,后者在每次升级时运行。当您进行数据库更改时,您需要更新这两个文件。

于 2008-09-30T13:32:34.457 回答
0

使用 grails 应用程序,索引默认存储在源代码管理中,因为您在代表域对象的文件中定义索引定义。仅提供“Grails”视角作为仅供参考。

于 2008-09-30T13:32:48.887 回答