集群索引,mysql和Rails

时间:2013-07-11 10:46:57

标签: mysql ruby-on-rails

我正在帮助使用Rails应用程序,目的是让该应用程序成为多租户。这意味着数据库表中会有来自多个用户/组织的数据,并且访问路径通常都是“为我的组织获取所有数据”。

我们使用MYSQL作为数据库。

默认情况下,Rails使用id列在表上创建主键。 id列自动递增。这在某些方面很好 - 总是在表的末尾添加行。但是,请考虑以下情况:

  • 一个名为foo的对象。 foo有一个id,总是有一个 organisation_id
  • 随着时间的推移,每个组织都会在数据库中创建foos,这些foos 在整个表中交错(它们以id顺序存储)
  • 涉及列出该组织的所有foos的用例

我遇到的问题是,组织中的foos并没有紧密地放在数据库中,实际上它们的传播非常不合理。理想情况下,我会在桌面上创建(organisation_id,id)的主键,这将导致给定组织的所有foos在表中并排。

不幸的是,当我这样做时,Rails给了我一个'模型Foo中表格foos的未知主键'错误。我想我可以通过使用复合键gem来处理这个问题,但似乎应该有一些方法可以在数据库级别使它透明。

有替代方法吗?

作为参考,数据库上用于更改索引的命令是:

ALTER TABLE foos ADD KEY(id); #needed是因为id列是自动增量

ALTER TABLE foos DROP PRIMARY KEY,添加主键(organisation_id,id);

编辑1:一篇博客文章,指出使用composite_primary_keys gem成功完成此操作。这让我对这种方法更有信心,问题是它是从2008年开始的,所以事情可能已经发生了变化。 http://www.joehruska.com/?p=6

编辑2:我考虑的另一个选择是分区 - 组织的数量可能不会超过最大分区,我可以将它们分组,而不会损失太多的好处。不幸的是,关键引用是表上的每个唯一键必须使用表的分区表达式中的每一列。 (这也包括表的主键 - 来自MYSQL手册http://dev.mysql.com/doc/refman/5.6/en/partitioning-limitations-partitioning-keys-unique-keys.html

所以我仍然需要再次使用复合主键。我有点惊讶Rails非常关心主键,而不仅仅是键存在。

1 个答案:

答案 0 :(得分:0)

如果您不想使用composite_primary_keys,那么您可能会因仅依赖:organisation_id[:organisation_id, :id]上的标准索引而陷入困境 我的理解是Rails非常关心PrimaryKeys,因为假设是模型之间的关系。也许它应该得到改善,你总是可以把它建议为未来的功能。