在rails中创建连接表;添加索引时,它们不应该是双向的

时间:2015-09-17 20:38:37

标签: ruby-on-rails

在docs和SO上(虽然我再也找不到链接),但是不要忘记为连接表创建索引,这是非常有用的提示。

像这样一个

  

不要忘记将索引添加到HATM表:

     

add_index:developers_projects,[:developer_id,:project_id]

在这里找到API DOC

但不应该像

那样
add_index :developers_projects, [:developer_id, :project_id]
add_index :developers_projects, [:project_id]

至少在某些情况下作为提示,来自另一方?或者我是否会再次错过Rails并自动发生?

2 个答案:

答案 0 :(得分:0)

多列索引就是你通常需要的,因为它们可以“双向”工作。事实上,在HABTM关系中,有三种方法可以达到两列索引。

在你的情况下......

  1. 查询'project_id = 1'会询问INDEX的全部内容 'developers_projects'记录有'project_id = 1'
  2. 查询 对于'developer_id = 1',将询问INDEX的所有内容 'developers_projects'记录中包含'developer_id = 1'
  3. 查询 对于'project_id = 1 AND developer_id = 1',将询问INDEX的所有内容 'developers_projects'记录同时包含'project_id = 1'AND 'developer_id = 1'
  4. 希望这会有所帮助: - )

答案 1 :(得分:0)

在某种程度上,它可能取决于数据库和版本。

如果数据库允许仅索引扫描,那么如果要查找每个开发人员的所有项目每个项目的所有开发人员,则创建索引:

add_index :developers_projects, [:developer_id, :project_id]
add_index :developers_projects, [:project_id  ,:developer_id]

如果数据库必须始终触及该表(PostgreSQL的旧版本),那么:

add_index :developers_projects, :developer_id
add_index :developers_projects, :project_id  

...虽然您可能正在升级到稍后支持仅索引访问的版本,但您仍然有理由以未来的方式创建第一个版本。