所以这更像是一个设计问题.

我有一个主键(比如用户的ID),我有大量与该用户相关的信息.

我应该根据信息将多个表分为多个类别,还是应该只有一个表包含多个列?

我过go 的做法是有多个表,比如说,一个用于应用程序使用数据的表,一个用于配置文件信息的表,一个用于后端令牌的表等等,以使事情看起来井然有序.

最近有人告诉我,最好不要这样做,有一个有很多列的表也可以.问题是,所有这些列都有相同的主键.

我对数据库设计非常陌生,那么哪种方法更好,利弊如何?

传统的做法是什么?

推荐答案

任何时候,信息都是一对一的(每个用户都有一个名称和密码),那么最好将其放在一个表中,因为这样可以减少数据库检索结果所需的连接数.我认为有些数据库对每个表的列数有限制,但在正常情况下我不会担心,如果需要的话,您可以随时在以后拆分它.

如果数据是一对多(每个用户有数千行使用信息),那么应该将其拆分为单独的表,以减少重复数据(重复数据浪费存储空间、缓存空间,并使数据库更难维护).

你可能会发现维基百科关于database normalization的文章很有趣,因为它深入地讨论了原因:

数据库规范化是组织关系数据库的字段和表以最小化冗余和依赖性的过程.规范化通常涉及将大型表划分为较小(且冗余较少)的表,并定义它们之间的关系.其目的是隔离数据,以便在一个表中添加、删除和修改字段,然后通过定义的关系传播到数据库的其余部分.

Denormalization还需要注意,因为在某些情况下,重复数据更好(因为它减少了数据库在读取数据时需要做的工作量).我强烈建议您从一开始就尽可能规范化数据,并且只有在您意识到特定查询中的性能问题时才进行非规范化.

Mysql相关问答推荐

配置MySQL服务器以管理数千个表

查询具有JSON对象数组的列时,JSON_CONTAINS的MySQL语法错误

从表中 Select 具有不同顺序的列

如何创建一个列,该列在另一个表中具有值的计数?

如何分解分组依据的数据?

根据 JOIN 结果计算列中的值?

如何优化使用多个 LEFT JOIN 和 GROUP BY 子句的慢速 MySQL 查询?

为什么order by子句可以利用索引?

在 Codeigniter MySQL 中从另一个数据库获取数据

了解 Spring 和数据库级别的事务?

MySQL 1292 截断不正确的日期时间值:'2020-09-11T08:32-50Z'

如何在考虑另一表的值的情况下计算一列的值

通过 Gorm 查询模型

按长度过滤 varbinary 字段

结果差异(MySQL 5.7 vs MySQL 8.0)

MySQL 添加一个 NOT NULL 列

PHP PDO 与普通 mysql_connect

在 spring-boot jpa hibernate 中 >4<24 后与 Db 的连接终止

在 MySQL Workbench EER 图中的多个列上创建唯一约束

如何通过一个语句描述数据库中的所有表?