sql - 相同表之间的 2 种不同类型的关系

标签 sql postgresql

目前正在构建一个系统,允许站点管理员构建自定义步骤问卷。主要实体是 stepsstep_optionsStep 是问卷中的实际步骤 step_options 是可以在该步骤中选择的选项。

sub-steps 的概念是一个步骤如何作为另一个步骤的子步骤附加。 sub-steps 也可以附加到 step-option

这让我在选项和步骤之间存在一些循环依赖。

  • 一个步骤有很多选项
  • 一个步骤可以属于一个步骤
  • 一个步骤可以属于一个选项

所以一个步骤既有很多,也可能属于一个选项。目前这是我的表结构。

steps:
- id
- title
- parent_id (step_id)
- option_id
...

step_options:
- id
- step_id
- name
...

这是解决此问题的正确方法吗?我还考虑过为属于选项的步骤添加一个中间表 (option_step)。我有点费劲的一件事是查询所有“根”步骤,这些步骤没有 parent_idoption_id,以及它们的所有选项和属于选项的步骤。

最佳答案

模型看起来不错。这是一个经典的层次模型,例如员工和经理。

  • 为什么在步骤表中有 option_id?您可以使用 (where step_id = step.id) 查询 option_step 表以获取多个选项。我假设每个 step_option 都是唯一的。并且 step_option 不能属于多个步骤。

替代方法是说您有一些对几个步骤通用的“选项”。如果是这种情况,您可以创建一个新对象 option_group 作为

id    PK of option_group

然后在“step_options”中而不是 step_id 中放置 option_group_id。

现在在“步骤”表中,您也可以提及 option_group_id。

通过以上内容,您可以开始在几个步骤中共享选项集合。

关于sql - 相同表之间的 2 种不同类型的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55483995/

相关文章:

mysql - 四表sql查询

SQL组2个不同的表

sql - 如何使用原始 SQL 插入外键字段?

regex - 在 PostgreSQL 9.3 中更改 varchar 列中的日期格式

sql - 棘手的 postgresql 查询优化(带排序的不同行聚合)

mysql - 如果至少满足一个条件,则排除查询中的唯一 ID

sql - 使用 case 语句有条件地设置变量

sql - Spark 1.3 中未找到命令策略类

postgresql - 如何将本地 postgresql 数据库迁移到 azk?

mysql - 传输到 PostgreSQL 后出现“关系不存在”错误