【问题标题】:Rails 5, Replace a Join Table With A Postgres ArrayRails 5,用 Postgres 数组替换连接表
【发布时间】: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


【解决方案1】:

您可以使用 Postgres 数组或 JSON 或枚举字段,但这会影响性能。
Look here

【讨论】:

  • 由于我们不必进行连接,性能不会提高吗?
【解决方案2】:

第一个缺点是您无法查询以找到集成中的工作,例如:

jobs table
id
1
2

integrations table
id, name, job_ids
1, i1, [1,2]
2, i2, [2]

所以,如果您想查找 ID 为 2 的作业的集成,您需要扫描集成表并检查 job_ids 的值是否为 2。如果集成表有很多记录,这是一个很大的性能问题。

如果你有一个连接表,那只是一个非常简单的查询,而且速度更快。 如果您使用连接表,我看不出有什么问题。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2016-07-31
  • 2013-02-28
  • 1970-01-01
  • 1970-01-01
  • 2021-03-19
  • 1970-01-01
  • 2018-11-23
  • 1970-01-01
相关资源
最近更新 更多