数据库设计 - 一个表或多个表/联接

时间:2012-09-04 13:57:22

标签: mysql database database-design

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

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

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

2 个答案:

答案 0 :(得分:3)

这是一个经典的数据库设计;它被称为“normalization”,通常被认为是最佳做法。

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

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

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

在这种情况下,联接不会使数据库变慢 - 关系数据库的关键在于管理这种场景非常有效(“关系”指的是数据可以相关的事实)。

答案 1 :(得分:0)

最好使数据库关系,就像它一样。这种结构将消除数据异常的风险,并且可以随着规模和域特定的变化做好准备(即当您添加新的权限时会发生什么?)

JOIN是数据库的自然组成部分,它们非常有效。

为什么这是良好做法的具体细节被汇总到我们称之为database normalization

的内容中