【问题标题】:best-practice for ordered many to many relation?订购多对多关系的最佳实践?
【发布时间】:2019-05-22 18:00:22
【问题描述】:

我想为我的产品设计一个 PostgreSQL 数据库,它需要处理有序的多对多关系。有两种解决方案:

  • (规范化数据库)创建一个中间表并将关系的顺序放入其中
  • (非规范化数据库)使用非规范化数据库并将所有数据保存在一张表中

我的数据模型是这样的:

表1(练习):

  • id

  • 姓名

表 2(锻炼):

  • 顺序的一组练习

每个用户都可以创建自定义锻炼(具有定义顺序的锻炼列表)。我的问题是在数据库中保存关系的顺序,因为默认关系不保留顺序。

【问题讨论】:

  • @displayName 感谢您的回复。一般来说,我知道两者的优缺点,但我想知道处理有序关系的最佳实践。
  • 规范化最佳实践。然而,在 3NF 之后,一般来说,它开始对性能造成的伤害大于它增加的价值。
  • 我不明白这个问题。你所说的“有序”或“有秩序的练习”是什么意思?模式的规范化为您提供带有键的表。认为键是有序的是一种常见的误解。如果您想说某行“大于”其他行,则需要其值代表该值的列。但该表并未因此排序。您可以使用ORDER BY 编写查询,以某种物理顺序显示行。这不会使表格有序。
  • 我目前的通用评论是“更好”/“最好”等:除非你定义它,否则工程中没有“更好”/“最好”之类的东西。同样不幸的是,所有合理的实际定义都需要大量的经验,以及与对细节的混乱敏感度相互作用的大量因素。进行简单的设计。当您通过测量证明您可以想到的设计和所有替代方案都存在问题时(无论当时意味着什么),然后提出一个非常具体的问题。这也应该定义“更好”/“最好”。 meta.stackexchange.com/q/204461

标签: database database-design relational-database database-normalization denormalized


【解决方案1】:

正如在 cmets 中所说,“最佳实践”假定只有一种最佳方式来做事,但事实并非如此。在几乎所有软件设计解决方案中,您都必须以混乱、不可预测的方式进行交易,而这几乎总是依赖于上下文。

如果我理解您的问题,您的问题域具有创建零个或多个锻炼的“用户”的概念,并且每个锻炼都有一个或多个练习,并且该练习发生的顺序是锻炼和锻炼之间关系的重要属性。

存储多对多关系属性的常规方法是作为连接表上的附加列。

标准化的存储方式如下:

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"

在权衡方面,我预计这将在商品硬件上扩展到数亿行,而不会面临重大挑战。查询可能会变得相当复杂——您将加入 4 个表——但这就是数据库的设计目的。数据模型使用单独的实体等描述(我理解的)问题域。

【讨论】:

  • 经过数小时的搜索,我更倾向于使用标准化数据库。感谢您的帮助
猜你喜欢
  • 2014-09-25
  • 1970-01-01
  • 2020-05-22
  • 1970-01-01
  • 1970-01-01
  • 2015-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多