繁体   English   中英

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

[英]Database Design - One table or multiple tables/joins

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

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

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

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

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

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

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

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

最好是将数据库关系化,就像它一样。 此结构将消除数据异常的风险,并准备好更改规模和域特定(即,当您添加新类型的权限时会发生什么?)

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

为什么这是良好实践的具体细节被收集到我们称之为数据库规范化的内容中

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM