Rails 5,用Postgres数组替换连接表

时间:2017-07-12 16:36:32

标签: ruby-on-rails arrays postgresql heroku

假设我们有一个执行“工作”的系统。这些工作可以连接成我们称之为“集成”的序列,这些序列实际上是一组有序的工作。

经典的解决方案是连接表:

integrations: id, name
jobs: id, name, commands
integrations_jobs: id, integration_id, job_id, integration_order

其中integration_order是整合中该integration_job的位置。

如果我们只使用了一个postgres数组呢?

integrations: id, name, [job_id1, job_id2, job_id3]
jobs: id, name, commands

使用数组而不是连接表时,我是否有任何明显的缺点?我们在Heroku上使用Rails 5和Postgres。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

第一个缺点是您无法查询在集成中查找作业,例如:

jobs table
id
1
2

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

因此,如果要查找标识为2的作业的集成,则需要扫描集成表并检查job_ids是否具有2的值。如果集成表有很多记录,那么这是一个很大的性能问题。

如果你有一个连接表,那只是一个非常简单的查询,速度更快。 如果您使用连接表,我不会看到错误。