MySQL数据库结构:更多列或更多行

我收集人们如何用表格中的类别标记主题,如:

ID | topic_id | votes_Category_1 | votes_Category_2 |.......... | votes_Category_12

由于历史原因,我每小时都会丢弃这张桌子.
让我们说表包含200万行.在历史表中每小时倾倒一次.

如果我想添加Column_13列,这个解决方案不灵活,所以我在考虑这个:

ID | topic_id | Category_id | vote_count

此解决方案将为每个主题创建12行,其结构更好,更灵活,但我必须每小时转储2400万行.

我需要每个类别中最好的10个主题!
我想知道在案例2中使用Max on votes(其中category_id = x和topic_id = y)将比情况1慢:按categoy_x排序其中topic_id = y

哪一个会更好JUST !!!从表现角度来看:

>拥有包含14列的200万行
>拥有4列的2400万行

谢谢

最佳答案 我会看一下检索模式来决定方法.

>如果按类别检索主题,那么我将采用第二种方法,在类别字段上定义索引,以便将给定类别的所有记录连续(相对)存储在磁盘上,从而减少磁盘页数要检索.这也是因为与所有类别作为列的表相比,记录大小更小.优点是可以轻松添加更多类别,并且缺点是重复(ID,TopicID)列数据会影响数据的总大小.
>如果按主题检索,那么我会采用第一种方法,定义主题的索引.这将减少每个类别的(ID,TopicID)列值的重复,从而减少要存储的数据的总大小,并且由于行数以每小时数百万计,因此这种尺寸的减小必须是显着的.缺点是需要修改新类别的架构.

编辑:
考虑编辑中的检索模式:

I retrieve top topics and their values per Category so i order by votes_Category_x in case 1.

我理解这是在给定类别中查找具有最大投票数的前N个主题

In case 2 I would look to find max(category) for each topic_id.

这是SELECT TopicID,MAX(投票)FROM TABLE GROUP BY TopicID,Category.

记录的大小对于2百万行和24百万行是不同的,但是,重复ID和TopicID,这肯定会增加数据大小,每个记录增加8个字节.

第一个表存储200万个记录,每个记录大小为60字节(4 * 15英寸),第二个表存储2400万条记录,每个记录大小为16字节(4 * 4英寸).第二个表每小时将添加约62页,每页4KB.在一段时间内似乎是一种担忧.这也将影响由于在中间插入数据而导致的碎片,因为在第二种方法的情况下索引按类别进行组织.

在继续使用其中一个表结构之前,可能值得运行一些性能测试以更好地理解这一点,并且还要考虑添加类别的频率.

点赞