如何设计一个包含许多列的数据库?
How do I design a database with many columns combined into one?
我有一个管网站,其中一个选项是 select 视频可以进入的类别。上传者可以决定 select 所有 94 个类别。我当前的设计有 94 列(加上其他列),每个类别一列。有没有一种方法可以将所有 94 个组合成一列 categories
而不是 this cat 1
、this 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.
我有一个管网站,其中一个选项是 select 视频可以进入的类别。上传者可以决定 select 所有 94 个类别。我当前的设计有 94 列(加上其他列),每个类别一列。有没有一种方法可以将所有 94 个组合成一列 categories
而不是 this cat 1
、this 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.