当用户有不同数量的输入时如何考虑数据库设计
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 的表,那将不会有问题。现在,我并不是说你不能去规范化,但我想说的是,这种设计也需要权衡。以上是关于当用户有不同数量的输入时如何考虑数据库设计的主要内容,如果未能解决你的问题,请参考以下文章