压缩数据库中的列数是否有益?

Is condensing the number of columns in a database beneficial?

假设您要为每个电影记录记录三个数字...比方说,:release_year:box_office:budget

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

它会保存任何数据库 space 或提供任何其他好处以将所有三个数字压缩到一个伞列中吗?

所以当三个数字相加时,它会是这样的:

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

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

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

以下是您可能会遇到的一些问题:

  1. 您将无法添加索引来提高查找具有特定属性值的记录的性能或排序过滤
  2. 您将无法查询特定的属性值
  3. 您将无法按特定列值排序
  4. 这些值将被存储并表示为字符串,而不是整数

...我可以继续。没有优点,只有缺点。

同意楼上的意见,作为例子尝试使用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)