正如 @eviltrout 所说,我们现在在许多插件中使用了迁移和专用表,并取得了巨大成功。能够强制实施数据库约束有助于提升性能(任意列的查找)和数据完整性(通过唯一索引)。这两点在我们部分托管客户的规模下显得尤为重要——这在我加入团队之前并未充分考虑。
我参与开发的第一款实质性插件是 chat-integration,当时我实现了一个非常繁琐的“模拟 ActiveRecord”,它依赖于插件存储。 hindsight 来看,使用专用表会是更好的选择,未来我可能会考虑将该插件迁移到这种模式。
我同意,当涉及修改核心表时,在现有表上添加或修改列可能会在日后产生意想不到的后果,并且即使插件被卸载,这些更改也会保留。我强烈不建议这样做。
另一方面,专用表的风险相对较低。如果插件被卸载,这些表只会保留下来,而不会产生任何负面影响(只要你不引入任何外键约束)。留下数据并不比使用插件存储更糟糕。
关于清理工作,我们可以考虑提供用于“逆向”插件迁移的 rake 任务来进行清理。但说实话,我认为这不会得到太多使用。我的假设是,人们很少卸载插件,即使卸载了,他们也更倾向于保留数据,以防将来需要重新安装。