数据库设计:多表 vs 单表
数据库设计:多表 vs 单表
我正在制作一个网站,其中包含不同类型的项目,如博客、帖子、文章等等。用户可以将其中任何一个项目设为自己的收藏。现在当我思考这个问题时,我有两个选择:
- 为每种类型的对象制作一个用户收藏的表。
- 为所有用户的所有类型对象制作一个公共表。
第一种结构的问题是我必须查询很多表才能显示特定用户的收藏。但这将使我能够轻松将收藏分成不同的类别。
然而,如果我需要在一个页面上显示所有收藏并将它们按时间排序合并,那就很困难了。但如果我使用第二种模式,我可以轻松获取最新的收藏,并且按对象类型分组也不难,但我将有一个大的全站表。
这两种策略中哪种更具可扩展性。
第一种策略涉及多个数据库查询,而第二种策略涉及一个大的单一表。
如果有帮助的话,我正在使用MySql
。
问题的出现的原因:网站上有多个模块,每个模块都有自己的表,并且有一个喜欢的表,用户可以喜欢或不喜欢一个帖子。现在想知道的是,当用户数量增加且这些表开始填满时,会发生什么。
解决方法:可以将所有模块的喜欢或收藏信息存储在一个单独的表中,而不是分别存储在每个模块的表中。这样做可以简化查询,并提高性能。
我在我的网站上有这样的设计。我的模块有:新闻、文章、视频、照片、下载、评论、测验、投票等等。它们都存在各自的表中。我有一个喜欢的表,用户可以喜欢或不喜欢一个帖子。获取这些信息的查询并不复杂。
首先,对于大部分模块,它们的表结构大致相同:
- id
- title
- content
- user_id(作者)
- date
- 等等
有一些例外,有时标题被称为问题,或者没有内容列。这并不会引起任何问题。
我的喜欢表的结构如下:
- id
- page_id
- module_id(来自哪个表...我有一个模块表,每个模块都有标题、关联id、目录等)
- post_id(对应于模块表的id)
- user_id(点赞或发帖的用户)
- status(0 = 喜欢,1 = 不喜欢)
- date(点赞/不喜欢发生的日期)
模块表示例:
id title directory post_type
1 News news news
2 Episode Guide episodes episode
3 Albums discography/albums album
你的设计可能会有类似的设置,根据你的需求修改表结构。
获取特定用户所有喜欢或收藏的查询:
$getlikes = mysql_query("SELECT DISTINCT post_id, module_id, page_id FROM likes WHERE user_id = $profile_id ORDER BY id DESC LIMIT $offset, $likes_limit", $conn);
$likes = mysql_num_rows($getlikes);
if($likes == "0"){
echo "
";
}
else {
echo "
Post | Module | Page |
---|---|---|
$like_post_title | $mod_title | $fpg_url |
";
// FUNCTIONS - Pagination links PaginationLinks("$cs_url/users/$profile_id", "likes"); echo " |
";
} // end else if no likes
这可能很难理解,因为有很多自己的变量,但基本上它从喜欢的表中获取模块id和帖子id,然后运行一个查询来获取帖子的标题和其他我想要的信息,比如原始作者。
我已经设置了“模块”函数,可以根据提供的id返回模块的url或标题。
非常感谢你给出详尽的答案。我也有一个与你类似的结构,所以将它们存储在同一个表中并不困难。此外,我正在使用Python的Django框架,它有一个通用外键(Generic Foreign Key)。这使我可以在同一个表中存储不同的对象引用。但我的问题不是操作性的,而是基于性能的。当用户数量增加且这些表开始填满时,会发生什么情况?