当前位置: 首页 > 面试题库 >

该数据库表应该标准化吗?

蔚琦
2023-03-14
问题内容

我已经接管了一个存储健身信息的数据库,而我们正在讨论某个桌子以及该桌子应该保留为一张表还是分成三张表。

今天,有一张表叫做: workouts ,具有以下字段

id, exercise_id, reps, weight, date, person_id

因此,如果我一天进行2组3个不同的练习,那一天我在该表中将有6条记录。例如:

id, exercise_id, reps, weight, date, person_id
1, 1, 10, 100, 1/1/2010, 10
2, 1, 10, 100, 1/1/2010, 10
3, 1, 10, 100, 1/1/2010, 10
4, 2, 10, 100, 1/1/2010, 10
5, 2, 10, 100, 1/1/2010, 10
6, 2, 10, 100, 1/1/2010, 10

所以问题是,鉴于在多个记录中有一些冗余数据(日期,人员ID,exercise_id),是否应将其标准化为三个表

WorkoutSummary
- id
- date
- person_id

WorkoutExercise
- ID
- workout_id(foreign key into WorkoutSummary)
- exercise_id

WorkoutSets
- workout_exercise_id (foreign key into WorkoutExercise)
- reps
- weight

我猜想它的缺点是,在此重构之后查询会变慢,因为现在我们需要联接3个表来执行以前没有联接的相同查询。重构的好处是,将来可以在锻炼摘要级别或锻炼级别添加新字段,而无需添加更多重复项。

对此辩论有任何反馈吗?


问题答案:

不要以为标准化后查询会变慢。如果对表进行正确索引,则对少量表的联接将非常便宜。

另一方面,对非规范化表的查询很容易导致速度变慢。例如,在您的原始架构中,仅尝试查询完成锻炼的不同日期比使用标准化版本要昂贵得多。

在这一点上一定要对其进行归一化。如果以后遇到性能问题,那么 除了 已经规范化的架构 之外
,您还可以开始选择性地对数据的某些部分进行规范化。但是,使用小型数据库绝不可能达到这一点。



 类似资料:
  • 问题内容: 我有一个当前正在使用的Web应用程序,该应用程序将MySQL数据库用作后端,在继续进行下去之前,我需要了解哪种情况更适合我的情况。 简而言之,在此应用程序中,用户将能够使用任何数字字段(由他们决定)构造自己的表单,现在我将其全部存储在由外键链接的几个表中。我的一个朋友建议为了使事情“轻松/快速”,我应该将每个用户的表单转换为一个平面表,以便从他们那里查询数据保持快速(以防万一)。 我应

  • 问题内容: 用Java创建单例的最佳方法是什么?数据库连接是否应该是单例连接(单例连接是自动线程安全的)?因为理论上数据库不能被许多用户同时访问。 问题答案: 数据库连接通常不应为单例。 两个原因: 许多数据库驱动程序不是线程安全的。使用单例意味着如果您有多个线程,它们将共享同一连接。单例模式不会给您带来安全感。它仅允许许多线程轻松共享“全局”实例。 就我个人而言,我认为Singleton通常会导

  • 问题内容: 在为数据库(例如MySQL)设计模式时,会出现一个问题,即是否要完全规范化表。 一方面,联接(以及外键约束等)非常慢,另一方面,您会获得冗余数据和潜在的不一致情况。 这里“最优化”是正确的方法吗?即创建一个书本归一化数据库,然后查看可以进行归一化以实现最佳速度增益的内容。 对于这种方法,我的担心是,我将选择一个可能不够快的数据库设计- 但是在那个阶段重构模式(同时支持现有数据)将非常痛

  • 问题内容: 我的数据库中有以下两个表(索引 不 完整,因为它将基于我使用的引擎): 表格1: 表2: 表1将用于创建缩略图库,其中包含指向较大版本图像的链接。,,和将优化显示的缩略图。 表2包含 与 表1中的图像 相关的 图像。因此,使用关联表1中的单个图像和表2中的一个或多个图像。这就是我考虑使用InnoDB外键功能的地方,但是我我也熟悉MyISAM中索引的功能。 无需过多研究其余字段,就可以对

  • Python自带一个轻量级的关系型数据库SQLite。这一数据库使用SQL语言。SQLite作为后端数据库,可以搭配Python建网站,或者制作有数据存储需求的工具。SQLite还在其它领域有广泛的应用,比如HTML5和移动端。Python标准库中的sqlite3提供该数据库的接口。 我将创建一个简单的关系型数据库,为一个书店存储书的分类和价格。数据库中包含两个表:category用于记录分类,b

  • 问题内容: 我经常看到这样初始化数组: 但是,阅读《语言基础- 数组》 显示,短语法不需要显式实例化构造函数: 另外,您可以使用快捷方式语法创建和初始化数组: 因此,假设这两种初始化方法: 这些之间有什么区别吗?两者看起来都一样,在这种情况下,我应该假设第二个隐式调用the ,第一个只是更冗长的方式,还是在幕后呢? 从Java开始,如果这太愚蠢了,对不起,但是我在网上找不到关于此的任何信息。 问题