sql - 使用 1 个带 3 个外键的联结表或 2 个共享排序的联结表?

标签 sql postgresql database-design junction-table

我有 3 个表,我试图正确地在它们之间创建关系:

  • 游戏阶段
  • 游戏事件(“游戏阶段”中的一个步骤)
  • Action 窗口(“游戏阶段”中一种完全不同的步骤)

一个“游戏阶段”可以有一个或多个“游戏事件”,一个“游戏事件”可以在一个或多个“游戏阶段”中发生。 (多对多)

一个“游戏阶段”可以有一个或多个“ Action 窗口”,一个“ Action 窗口”可以发生在一个或多个“游戏阶段”中。 (多对多)

“游戏事件”与“操作窗口”无关。

但是,我对创建 2 个单独的联结表犹豫不决,因为“游戏事件”和“ Action 窗口”共享相同的发生顺序(又名序列)编号系统每个“游戏阶段”。我不确定我将如何维护它。

在仍然能够轻松跟踪出现顺序的同时布置这些表格的最合适方法是什么?

最佳答案

我建议一个设计来代表序列“游戏事件”“ Action 窗口”,相关彼此属于同一序列步骤中的同一序列。

也就是说,引入“gaming sequence”和“gaming sequence detail”实体,“设计”地避免了连接表,代表了共享的排序事实通过在“游戏顺序”(由于考虑到“'游戏事件'与' Action 窗口'无关”)。

架构

+--------------+ 1      1,n +-------------------+ 1,n
|  game_phase  +------------+  game_phase_play  +----+
|              |            |                   |    |
+--------------+            +-------------------+    |
                                                     |
                                                     | 1
+--------------------------+ 1,n         1 +---------+---------+
|  gaming_sequence_detail  +---------------+  gaming_sequence  |
|                          |               |                   |
++--------+----------------+               +-----+-------------+
 | 1,n    |                                      |
 |        +---+  seq_step                        +---+ seq_steps_number
 |
 |
 |                                      +--------------+
 |                                +-----+  game_event  |
 | 1,n +----------------+         |     |              |
 +-----+  gaming_value  | <-------+     +--------------+
       |                |         |     +-----------------+
       +----------------+         +-----+  action_window  |
                                        |                 |
                                        +-----------------+

前缀

gph_                    === game_phase_
gseq_                   === gaming_sequence_
gv_                     === gaming_value_

表格

game_phase              ( id , description, ... )
game_phase_play         ( id , gph_id, gseq_id, date, description, ... )
gaming_sequence         ( id, seq_steps_number, ... )
gaming_value            ( id , type, ... )
gaming_sequence_detail  ( gseq_id, gv_id, seq_step, ... )

我还为“游戏事件”和“操作窗口”引入了一个泛化实体,名为“游戏值(value)”,对于包含在“游戏序列”中很有用。这种概括可能代表一种游戏不可变值(在我们的例子中是 2 种不同类型,但可扩展),因此所选择的命名(已经从“gaming objectified”和“gaming observable ”)。

博弈值(s)”在博弈序列中,两种类型的“步进”通过相等的(gseq_id, seq_step) pair in gaming_sequence_detail(有人可能会争辩说这种“配对”是一种关系;这种解决方案的作用更多就像在序列步骤中代表 sibling ,还允许扩展到超过 2 种类型的“游戏值(value)”)。

游戏序列细节中的“游戏事件”和“ Action 窗口”可以独立修改,也可能会出现“未配对”。

gaming_sequence_detail 中的一个约束是对于每个 seq_step 值都可以存在一个 game_event 和一个 action_window 等等单个 gseq_idseq_step 的最大基数是 2。

如果是这种情况,相同的 gaming_value 也可能在同一序列中出现多次。此外,这种设计还可以表示不同“游戏阶段游戏”之间的共享序列。

关于sql - 使用 1 个带 3 个外键的联结表或 2 个共享排序的联结表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33952849/

相关文章:

SQL 问题 : How to avoid 200 If-Else Statements?

php - 检查 MySQL 行中的值

sql - postgres 中数组的向量算术

mysql - 我还应该索引包含在 PRIMARY KEY 中的列吗?

mysql - 可视化数据库模式的好工具?

php - 为什么我的第一个sql语句不运行

mysql - 错误 1452 : Cannot add or update a child row

php - 使用 pg_insert() 后如何确定插入行的 pkey?

javascript - 如何将 PostgresQL 命令转换为 SQL 查询生成器语法

php - 我应该如何将这些多个值存储在我的 MySQL 表中?