【发布时间】:2017-12-17 05:05:05
【问题描述】:
假设我们有一个执行“作业”的系统。这些作业可以连接成我们称为“集成”的序列,它们实际上是一组有序的作业。
经典的解决方案是连接表:
integrations: id, name
jobs: id, name, commands
integrations_jobs: id, integration_id, job_id, integration_order
其中integration_order 是该集成作业在集成中的位置。
如果我们只使用一个 postgres 数组呢?
integrations: id, name, [job_id1, job_id2, job_id3]
jobs: id, name, commands
使用数组而不是连接表有什么明显的缺点吗?我们在 Heroku 上使用 Rails 5 和 Postgres。
【问题讨论】:
-
Postgres 目前不允许数组列作为外键,这意味着您将失去参照完整性。此外,ActiveRecord 不是为使用数组列进行关联而构建的,这意味着您将与框架作斗争。如果你翻转论点——在这种情况下,数组列给你带来什么好处?
-
感谢您的帮助。我们认为对集成进行版本控制会更简单。在不同的表中跟踪连接对象并记录每个连接对象的顺序历史比拥有数组历史要复杂得多。我们会通过编写自定义 Rails 验证来维护完整性,与框架有点冲突,但这似乎比对连接表进行版本控制更简单。
-
您可以简单地使用
has_many through:关联并使用Papertrail 对“连接模型”进行版本控制。
标签: ruby-on-rails arrays postgresql heroku