我正在帮助使用Rails应用程序,目的是让该应用程序成为多租户。这意味着数据库表中会有来自多个用户/组织的数据,并且访问路径通常都是“为我的组织获取所有数据”。
我们使用MYSQL作为数据库。
默认情况下,Rails使用id列在表上创建主键。 id列自动递增。这在某些方面很好 - 总是在表的末尾添加行。但是,请考虑以下情况:
我遇到的问题是,组织中的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非常关心主键,而不仅仅是键存在。
答案 0 :(得分:0)
如果您不想使用composite_primary_keys,那么您可能会因仅依赖:organisation_id
或[:organisation_id, :id]
上的标准索引而陷入困境
我的理解是Rails非常关心PrimaryKeys,因为假设是模型之间的关系。也许它应该得到改善,你总是可以把它建议为未来的功能。