当用户有不同数量的输入时如何考虑数据库设计

Posted

技术标签:

【中文标题】当用户有不同数量的输入时如何考虑数据库设计【英文标题】:How to think about a database design when users have different amounts of input 【发布时间】:2013-07-12 00:36:42 【问题描述】:

我正在尝试为我和我的朋友设计一个简单的应用程序来记录我们的锻炼。我似乎无法理解如何对数据建模。每个用户都可以输入锻炼。锻炼有 1 个或多个练习。每个练习有 1 组或更多组。每组至少有 1 个代表和重量。我能想到的最好的是下面。|

Workout Table       
1   User_A  9-Jul   
2   User_B  9-Jul   
3   User_C  9-Jul   
4   User_A  10-Jul  
5   User_D  10-Jul  
6   User_B  11-Jul

Exercise Table
1   Bench       3 reps  135 lbs Workout_1
2   Bench       3 reps  185 lbs Workout_1
3   Deadlift    5 reps  225 lbs Workout_2

我在正确的轨道上吗?这将是我第一次制作任何不是博客教程的应用程序。看起来练习表会很快变得非常大。或许这很正常?

【问题讨论】:

【参考方案1】:

您在正确的轨道上,您可能会添加 Users Table 并将您的 Workout Table 更改为 UsersWorkout Table 并在两者之间创建关系。然后您可能会将您的运动表更改为 WorkoutExercise 表并为 Exercise 创建一个具有运动类型的单独表(例如 卧推、硬拉)。

请参阅下面来自MS Access 的附加ERD

以下是每个表的示例数据:

用户

用户锻炼

锻炼的练习

最后是练习

顺便说一下,这些是Normalized 表,用于防止冗余并防止 UPDATE、DELETE、INSERT 异常。

【讨论】:

谢谢!是的,因为我了解那一面,所以我离开了用户表。这是我没有信心的其余部分。为什么把练习放在他们自己的桌子上更有意义,对我来说似乎没有必要?在规范化和大多数示例中,我发现它是有道理的,因为它类似于 ItemID、ItemName、ItemCostPerUnit 但拥有自己的表只是为了从名称更改为 id 真的更快? 在运动表上是的,您可以将它放在 WorkoutExercise 表上。但是,存在更新异常的危险,这是规范化表应该做的。例如,假设您想将运动类型从硬拉更改为硬拉(我知道我错了,但这只是为了举例)。让我们进一步说,您的锻炼表中已经有 100 万条记录。因此,这意味着您必须为此更新 1M 条记录。现在,对比一下,如果你有一个练习表,你只会更新一条记录! 另外,如果您有一个用户将其键入为 Deedlift 或 Deadlifts,那么您将有不一致的记录,但是如果您有 Example 的表,那将不会有问题。现在,我并不是说你不能去规范化,但我想说的是,这种设计也需要权衡。

以上是关于当用户有不同数量的输入时如何考虑数据库设计的主要内容,如果未能解决你的问题,请参考以下文章

具有多个嵌套表的数据库设计

数据字典

数据源动态变化时如何设计DAO

当结构在内部向量中包含各种数量的元素时,如何应用面向数据的设计?

当输入的数量可变时,如何使用神经网络?

如何制作动态层分组报表