1

我有一个现有的数据库,其结构如下:

user
user_profile
user_permissions
user_statistics

每个表都有一个唯一的列,用于将每个表连接在一起,如下所示:

SELECT *
FROM user
INNER JOIN user_profile ON user.user_id = user_profile.user_profile_id
INNER JOIN user_permissions ON user.user_id = user_permissions.user_permissions_id
INNER JOIN user_statistics ON user.user_id = user_statistics.user_statistics_id
WHERE user_id = 1

以这种方式做事有什么问题,还是更好的做法是创建一个包含很多列的表,这样就不需要连接?

4

2 回答 2

3

这是一个经典的数据库设计;它被称为“规范化”,通常被认为是最佳实践。

对数据库进行非规范化是有原因的——性能是经典。然而,这通常是以牺牲可维护性和一致性为代价的。它通常只在数据大小的极端情况下才有意义 - 您描述的模式应该扩展到大量记录,而连接不会成为问题。

我还猜测链接到“用户”的几个表对于给定用户有不止一条记录——“统计”通常对给定用户有很多行;权限也可以有一行代表每个用户的权限。在一个大表中建模将是可怕的。

一些设计者喜欢为逻辑上分离的数据创建单独的表。因此,您的设计可能包括一个“user_profile”表,每个用户只有一行,因为设计者认为这在逻辑上与“用户”数据是分开的——例如,它在不同的业务环境下会发生变化。在我看来,这主要是风格问题。

在这种情况下,连接不会使您的数据库变慢 - 关系数据库的重点是在管理这种情况时非常有效(“关系”是指数据可以关联的事实)。

于 2012-09-04T14:03:03.313 回答
0

最好使数据库具有关系,因为它是。这种结构将消除数据异常的风险,并为规模和领域细节的变化做好准备(即当您添加一种新的权限时会发生什么?)

JOIN 是数据库工作的自然组成部分,而且非常高效。

为什么这是良好实践的具体细节被汇总到我们所说的数据库规范化中

于 2012-09-04T14:04:22.847 回答