【问题标题】:Is condensing the number of columns in a database beneficial?压缩数据库中的列数是否有益?
【发布时间】:2015-11-20 23:06:50
【问题描述】:

假设您想为每条电影记录记录三个数字...假设: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

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

【问题讨论】:

  • 请不要那样做。最小的空间节省,以及尝试再次拆分数据的资源浪费是可怕的。尝试加入表格也会很痛苦
  • @JuanCarlosOropeza 是否可以计算出它节省了多少空间?
  • @JeffCaros 这将占用更多空间,因为您不再存储 3 个整数,而是一个字符串。整数将占用更少的空间。
  • varlena 标头也占用空间。和分隔符。真的。 不要这样做
  • @CraigRinger 什么是 varlena 标头?

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


【解决方案1】:

将这些属性压缩在单个列中没有任何好处。事实上,走这条路会增加代码的复杂性并限制你的能力。

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

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

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

【讨论】:

    【解决方案2】:

    同意上面的cmets,例如尝试使用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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多