繁体   English   中英

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

[英]Do you put your indexes in source control?

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

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

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

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

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

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

idx_t_01
idx_t_02

其中t是表的简短缩写。 当我试图让所有相关的列变得聪明时,我发现索引维护是不可能的,例如,

idx_c1_c2_c5_c9_c3_c11_5

区分这样的索引太难了。

有没有人有一个非常好的方法将索引维护集成到源代码控制和开发生命周期?

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

模式版本控制上有许多其他线程。

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

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

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

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

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

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

这样,如果我正在浏览sysobjects,我可以很容易地看到特定表的索引(这也是一种习惯的力量,在我使用的某些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脚本的一个小问题,一个练习留给读者。

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

指数命名:

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

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

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

至于他们是否属于源头控制,我不太确定。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM