首页 > 解决方案 > 如何设计一个将多列合并为一个的数据库?

问题描述

我有一个管网站,其中一个选项是选择视频可以进入的类别。上传者可以决定选择所有 94 个类别。我目前的设计有 94 列(加上其他列),每个类别一个。有没有办法可以将所有 94 个组合成一列categories而不是this cat 1,this cat 2等,然后可能会内爆插入?

我正在阅读另一个 Stack Overflow 问题,建议为每个问题添加新行,但我认为一个视频上传有 94 行是相当多余的吗?

标签: mysqldatabase-designimplode

解决方案


我同意其他 Stack Overflow 问题的建议(您没有引用)。考虑只为您的表维护三列:

CREATE TABLE video_categories (
    video_id INT NOT NULL PRIMARY KEY,
    user_id INT NOT NULL,
    category_id INT NOT NULL
)

也就是说,每条记录存储一个用户投票,每个视频,每个类别。这是一个相当规范的设计,让您不必尝试维护 94 个不同的列。当前设计中的一个明显缺陷是,如果添加新类别,您将被迫更改基础表设计。理想情况下,新传入数据不应破坏您的表格设计。

我上面提出的建议使查询数据变得相当容易。例如,要查找从包含三个或更多类别的用户那里获得评分的视频数量,我们可以尝试:

SELECT COUNT(DISTINCT video_id)
FROM
(
    SELECT video_id
    FROM video_categories
    GROUP BY video_id, user_id
    HAVING COUNT(*) >= 3
) t;

虽然上面的查询可能看起来很复杂,但对分布在 94 列中的类别执行相同的操作会复杂得多(并且难以维护)。


推荐阅读