数据库设计:多表 vs 单表

12 浏览
0 Comments

数据库设计:多表 vs 单表

我正在制作一个网站,其中包含不同类型的项目,如博客、帖子、文章等等。用户可以将其中任何一个项目设为自己的收藏。现在当我思考这个问题时,我有两个选择:

  1. 为每种类型的对象制作一个用户收藏的表。
  2. 为所有用户的所有类型对象制作一个公共表。

第一种结构的问题是我必须查询很多表才能显示特定用户的收藏。但这将使我能够轻松将收藏分成不同的类别。

然而,如果我需要在一个页面上显示所有收藏并将它们按时间排序合并,那就很困难了。但如果我使用第二种模式,我可以轻松获取最新的收藏,并且按对象类型分组也不难,但我将有一个大的全站表。

这两种策略中哪种更具可扩展性。

第一种策略涉及多个数据库查询,而第二种策略涉及一个大的单一表。

如果有帮助的话,我正在使用MySql

0
0 Comments

问题的出现的原因:网站上有多个模块,每个模块都有自己的表,并且有一个喜欢的表,用户可以喜欢或不喜欢一个帖子。现在想知道的是,当用户数量增加且这些表开始填满时,会发生什么。

解决方法:可以将所有模块的喜欢或收藏信息存储在一个单独的表中,而不是分别存储在每个模块的表中。这样做可以简化查询,并提高性能。

我在我的网站上有这样的设计。我的模块有:新闻、文章、视频、照片、下载、评论、测验、投票等等。它们都存在各自的表中。我有一个喜欢的表,用户可以喜欢或不喜欢一个帖子。获取这些信息的查询并不复杂。

首先,对于大部分模块,它们的表结构大致相同:

- 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 "

$profile_username does not have any liked posts at this time.

";

}

else {

echo "

";

while ($rowlikes = mysql_fetch_assoc($getlikes)) {

// echo data

$like_page_id = $rowlikes['page_id'];

$like_module_id = $rowlikes['module_id'];

$like_post_id = $rowlikes['post_id'];

// different modules have different fields for the "title", most are called title but quotes is called "content" and polls is called "questions"

if($like_module_id == "11"){

$field = "question";

}

elseif($like_module_id == "19"){

$field = "content";

}

else{

$field = "title";

}

// FUNCTIONS

PostURL($like_page_id, $like_module_id, $like_post_id);

ModTitle($like_module_id);

ModTable($like_module_id);

ModURL($like_page_id, $like_module_id);

fpgURL($like_page_id);

$getpostinfo = mysql_query("SELECT $field AS field FROM $mod_table WHERE id = $like_post_id", $conn);

$rowpostinfo = mysql_fetch_assoc($getpostinfo);

$like_post_title = $rowpostinfo['field'];

// Using my "tiny" function to shorten the title if the module is "Quotes"

if($like_module_id == "19"){

Tiny($like_post_title, "75");

$like_post_title = "\"$tiny\"";

}

if(!$like_post_title){

$like_post_title = "Unknown";

}

else {

$like_post_title = "$like_post_title";

}

echo "

";

$altrow = ($altrow == 'altrow')?'':'altrow';

} // end while

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)。这使我可以在同一个表中存储不同的对象引用。但我的问题不是操作性的,而是基于性能的。当用户数量增加且这些表开始填满时,会发生什么情况?

0
0 Comments

问题:在设计数据库时,应该使用多个表还是单个表?

原因:设计数据库时,需要考虑到不同类型的资源和用户的收藏关系。如果使用单个表来存储所有的信息,会导致数据冗余和查询效率低下。而使用多个表来存储不同类型的资源和用户的收藏关系,可以提高数据的组织性和查询效率。

解决方法:创建至少两个表来实现收藏系统。一个是"Types"表,用于存储资源的类型信息;另一个是"Favorites"表,用于存储用户收藏的具体信息。同时,还可以创建其他表,如"Posts"表用于存储帖子信息。

通过SQL查询语句可以获取到用户6收藏的帖子信息。

0
0 Comments

问题出现的原因是为了保持系统易于修改,因为业务模型随着时间的推移总是会发生变化,如果设计过于复杂,改变将变得更加困难。解决方法是采用规范化的数据库设计,即将数据拆分成多个小表,以便易于维护、修改和扩展。规范化的数据库设计可以提供清晰的架构和设计,而性能则不是当今世界的最大问题,因为处理和存储成本都较低。最后的决策是选择使用多个小表的规范化设计。

0