冷凝数据库中的列数是否有益?

时间:2015-11-20 23:06:51

标签: sql ruby-on-rails database postgresql database-optimization

假设您想要为每个电影记录录制三个号码......让我们说:release_year:box_office:budget

传统上,使用Rails,您只需将这三个属性添加到Movie模型,然后只需调用@movie.release_year@movie.box_office@movie.budget

它会保存任何数据库空间还是提供任何其他好处来将所有三个数字压缩成一个伞形列?

因此,在添加三个数字时,它会像:

def update
  ...
  @movie.umbrella = params[:movie_release_year] 
    + "," + params[:movie_box_office] + "," + params[:movie_budget]
end

因此,最终@movie.umbrella值将与" 2015,617293,748273"。

一致。

然后在控制器中,要访问这三个值,它将类似于

@umbrella_array = @movie.umbrella.strip.split(',').map(&:strip)
@release_year = @umbrella_array.first
@box_office = @umbrella_array.second
@budget = @umbrella_array.third

这样,它将是相同数量的数据(实际上多一点,带有额外的逗号)但只存储在一列中。这会比三列更好吗?

3 个答案:

答案 0 :(得分:4)

在单个列中压缩这些属性没有任何好处。实际上,遵循该路径会增加代码的复杂性并限制您的能力。

以下是您将面临的一些可能问题:

  1. 您将无法添加索引以提高查找具有特定属性值的记录的性能或对过滤进行排序
  2. 您将无法查询特定属性值
  3. 您将无法按特定列值排序
  4. 这些值将被存储并表示为字符串,而不是整数
  5. ......我可以继续。没有优点,只有缺点。

答案 1 :(得分:1)

同意上述评论,例如尝试使用 pg_column_size() 来比较结果:

WITH test(data_txt,data_int,data_date) AS ( VALUES
  ('9999'::TEXT,9999::INTEGER,'2015-01-01'::DATE),
  ('99999999'::TEXT,99999999::INTEGER,'2015-02-02'::DATE),
  ('2015-02-02'::TEXT,99999999::INTEGER,'2015-02-02'::DATE)
) 
SELECT pg_column_size(data_txt) AS txt_size,
         pg_column_size(data_int) AS int_size,
         pg_column_size(data_date) AS date_size
FROM test;

结果是:

 txt_size | int_size | date_size 
----------+----------+-----------
        5 |        4 |         4
        9 |        4 |         4
       11 |        4 |         4
(3 rows)

答案 2 :(得分:-1)

简短的回答?这取决于。

首先考虑存储空间非常便宜。一种方法相对于另一种方法节省的内存相对可以忽略不计。

另外,与不必每次执行该操作相比,执行操作(如在读取/写入数据库之前连接/拆分值)的成本很高。想象一个大型应用程序,这个列每秒被击中数百次,这个操作将使应用程序嘎然而止。

故事的道德,以最适合您的应用程序的方式存储数据。这些列成为一个列是否有意义?地址就是一个很好的例子,我们可能并不关心这个城市,只关注整个地址。