你把索引放在源代码管理中吗?

时间:2008-09-30 13:19:33

标签: sql database version-control indexing sdlc

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

说到数据库表的索引,我的理念是它们是编写查询数据库的任何代码的不可或缺的一部分。在不分析对索引的影响的情况下,您无法引入新查询或更改查询。

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

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

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

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

idx_t_01
idx_t_02

其中t是表的简短缩写。当我试图巧妙地使用所有相关的列时,我发现索引维护是不可能的,例如,

idx_c1_c2_c5_c9_c3_c11_5

要区分那样的索引太难了。

是否有人能够将索引维护集成到源代码管理和开发生命周期中?

9 个答案:

答案 0 :(得分:11)

索引是数据库架构的一部分,因此应该与其他所有内容一起进行源代码控制。在没有通过正常的质量保证和发布流程(特别是性能测试)的情况下,没有人应该在生产中创建索引。

架构版本控制上还有很多其他线程。

答案 1 :(得分:6)

数据库的完整架构应位于代码旁边的源代码管理中。当我说“完整模式”时,我指的是表定义,查询,存储过程,索引,整个批次。

在进行全新安装时,您会执行以下操作: - 查看产品的X版。 - 从结帐的“数据库”目录中,运行数据库脚本以创建数据库。 - 使用结账时的代码库与数据库进行交互。

在开发时,每个开发人员都应该针对自己的私有数据库实例。当他们进行架构更改时,他们会检查一组新的架构定义文件,这些文件对其修订的代码库起作用。

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

答案 2 :(得分:5)

是的,任何 DML或DDL更改都是编写脚本并签入源代码控制的,主要是通过rails中的activerecord迁移。我讨厌继续使用导轨的喇叭,但是在建立基于数据库的系统的许多年里,我发现迁移路线要比我使用或构建的任何本土系统好得多。

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

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

答案 3 :(得分: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迁移脚本会检查数据库以查看当前版本是什么,然后找到从那里(或向下)到达所需版本的.rb文件。 p>

为了完成开发过程的这一部分,您可以将这些内容检查到源代码管理中,并逐季尝试。

这里没有关于Rails的具体或特殊内容,只是这是我第一次看到这种技术被广泛使用。您也可以使用成对的SQL DDL文件,例如001_UP_add_foo_table.sql和001_DOWN_remove_foo_table.sql。其余的是shell脚本的一个小问题,一个练习留给读者。

答案 4 :(得分:0)

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

索引的命名:

  • IX_CUSTOMER_NAME,表格“customer”
  • 中的字段“name”
  • 主键的PK_CUSTOMER_ID,
  • UI_CUSTOMER_GUID,用于客户的GUID字段,该字段是唯一的(因此是“UI” - 唯一索引)。

答案 5 :(得分:0)

我总是源代码控制SQL(DDL,DML等)。它的代码与其他代码一样。这是一种很好的做法。

答案 6 :(得分:0)

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

至于他们是否属于源代码管理,我不太确定。

答案 7 :(得分:0)

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

答案 8 :(得分:0)

默认情况下,使用grails应用程序将索引存储在源代码管理中,因为您要在代表域对象的文件中定义索引定义。只是提供'Grails'视角作为FYI。