有序多对多关系的最佳实践?
best-practice for ordered many to many relation?
我想为我的产品设计一个 PostgreSQL 数据库,它需要处理有序的多对多关系。有两种解决方案:
- (标准化数据库)创建一个中间 table 并将关系的顺序放入其中
- (Denormalized DB)使用非规范化数据库并将所有数据保存在一个table
我的数据模型是这样的:
Table 1(练习):
id
姓名
Table 2(锻炼):
- 一组练习,顺序为
每个用户都可以创建自定义锻炼(具有定义顺序的锻炼列表)。我的问题是在数据库中保存关系的顺序,因为默认关系不保留顺序。
正如评论中所说,"best practice" 假设只有一种最好的做事方式,但事实并非如此。在几乎所有的软件设计解决方案中,您都必须以混乱、不可预测的table 方式进行交易,这几乎总是 context-dependent.
如果我理解你的问题,你的问题领域有一个 "user" 的概念,他创建零个或多个 work-outs,每个 work-out 有一个或多个练习,并且锻炼发生的顺序是锻炼和锻炼之间关系的一个重要属性。
存储 many-to-many 关系属性的正常方法是作为连接 table 上的附加列。
规范化的存储方式类似于:
user
-----
user_id
name
...
Workout
-----
workout_id
name
....
Exercise
------
exercise_id
name
....
workout_exercise
----------
workout_id
exercise_id
sequence -- this is how you capture the sequence of exercises within a workout
... -- there may be other attributes, e.g. number of repetitions, minimum duration, recommended rest period
user_workout
--------
user_id
workout_id
.... -- there may be other attributes, e.g. "active", "start date", "rating"
就 trade-offs 而言,我希望这可以在商品硬件上扩展到数亿行,而不会遇到重大挑战。查询可能会变得相当复杂——您将加入 4 tables——但这就是数据库的设计目的。数据模型使用单独的实体等描述(我理解的)问题域。
我想为我的产品设计一个 PostgreSQL 数据库,它需要处理有序的多对多关系。有两种解决方案:
- (标准化数据库)创建一个中间 table 并将关系的顺序放入其中
- (Denormalized DB)使用非规范化数据库并将所有数据保存在一个table
我的数据模型是这样的:
Table 1(练习):
id
姓名
Table 2(锻炼):
- 一组练习,顺序为
每个用户都可以创建自定义锻炼(具有定义顺序的锻炼列表)。我的问题是在数据库中保存关系的顺序,因为默认关系不保留顺序。
正如评论中所说,"best practice" 假设只有一种最好的做事方式,但事实并非如此。在几乎所有的软件设计解决方案中,您都必须以混乱、不可预测的table 方式进行交易,这几乎总是 context-dependent.
如果我理解你的问题,你的问题领域有一个 "user" 的概念,他创建零个或多个 work-outs,每个 work-out 有一个或多个练习,并且锻炼发生的顺序是锻炼和锻炼之间关系的一个重要属性。
存储 many-to-many 关系属性的正常方法是作为连接 table 上的附加列。
规范化的存储方式类似于:
user
-----
user_id
name
...
Workout
-----
workout_id
name
....
Exercise
------
exercise_id
name
....
workout_exercise
----------
workout_id
exercise_id
sequence -- this is how you capture the sequence of exercises within a workout
... -- there may be other attributes, e.g. number of repetitions, minimum duration, recommended rest period
user_workout
--------
user_id
workout_id
.... -- there may be other attributes, e.g. "active", "start date", "rating"
就 trade-offs 而言,我希望这可以在商品硬件上扩展到数亿行,而不会遇到重大挑战。查询可能会变得相当复杂——您将加入 4 tables——但这就是数据库的设计目的。数据模型使用单独的实体等描述(我理解的)问题域。