I would say, it depends.
First, compression matters a lot, proper compression could dramatically reduce the storage space needed.
Second, RedShift storage is managed at block (1MB) level, even if you just have ten bytes for a certain column, it will occupy one block space.
Third, it is relevant to vacuum, RedShift won't release the storage space for deleted records unless vacuum applied.
If you want to test the storage space using different table schema or compression types, you can use the following query:
SELECT trim(pgn.nspname) as Schema
,trim(a.name) as Table
,CASE WHEN LENGTH (TRIM (a.name)) > 30 THEN 'Y'
ELSE 'N'
END AS TableNameViolation
,id as TableId
,det.distkey
,det.NumberOfSortKeys
,det.FirstSortCol
,b.mbytes
,b.mbytes / 1024 AS GBytes
,det.HasEncoding
,a.rows
,a.unsorted_rows
FROM (SELECT db_id
,id
,name
,sum (rows) as rows
,sum (rows) - sum(sorted_rows) as unsorted_rows
FROM stv_tbl_perm a
GROUP BY db_id
,id
,name
) as a
INNER JOIN pg_class as pgc
ON pgc.oid = a.id
INNER JOIN pg_namespace as pgn
ON pgn.oid = pgc.relnamespace
LEFT OUTER JOIN (SELECT tbl
,count(*) as mbytes
FROM stv_blocklist
GROUP BY tbl
) b
ON a.id = b.tbl
INNER JOIN ( SELECT attrelid
,MIN (case attisdistkey when 't' then attname else null end) as "distkey"
,MIN (case attsortkeyord when 1 then attname else null end ) AS FirstSortCol
,MAX (attsortkeyord) as NumberOfSortKeys
,MAX (CASE WHEN attencodingtype > 0 THEN 'Y' ELSE 'N' END) as HasEncoding
FROM pg_attribute
WHERE attnum >= 1
GROUP BY attrelid
) as det
ON det.attrelid = a.id
WHERE mbytes IS NOT NULL
ORDER BY pgn.nspname
,mbytes DESC
;