如何设计一个包含许多列的数据库?

How do I design a database with many columns combined into one?

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

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

我同意另一个 Stack Overflow 问题的建议(您没有引用)。考虑只为 table:

保留三列
CREATE TABLE video_categories (
    video_id INT NOT NULL PRIMARY KEY,
    user_id INT NOT NULL,
    category_id INT NOT NULL
)

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

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

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

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

您可以将所有一对一关系保持在一个(正常)table 中。 (上传者 ID、视频 ID、上传时间戳、状态等)

然后你可以有一个 video_categories table 一对多关系:

video_id cat_id

这样你就可以拥有

1   |  4
1   |  45
1   |  91
2   |  3
3   |  17
1   |  9

然后根据视频的 ID 将第一个 table 与第二个 table 相关联,或者在需要时使用数据透视查询。

这将导致一对多table中的"more rows",但明显更少的列,最好的部分是不会有空space或冗余数据存储table.