一尘不染

使用1个具有3个外键的联结表还是2个具有共享排序的联结表?

sql

我有3个表,我试图在这些表之间 正确 创建关系:

  • 游戏阶段
  • 游戏事件(“游戏阶段”的一个步骤)
  • 动作窗口(“游戏阶段”中一种截然不同的步骤)

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

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

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

但是 ,我犹豫是否要创建2个单独的联结表,因为“游戏事件”和“动作窗口”在每个“游戏阶段”共享相同 的出现
(即序列)编号系统。我不确定该如何维持。

在仍然可以轻松跟踪发生顺序的同时,对这些表进行布局的最合适方法是什么?


阅读 149

收藏
2021-05-23

共1个答案

一尘不染

我建议一种表示 “游戏事件”“动作窗口” 序列 的设计,它们通过属于同一序列步骤中的同一序列而相互关联。

也就是说,引入“ 游戏序列 ”和“ 游戏序列细节 ”的实体,联接表,避免“设计”,代表“的共享测序事实 游戏事件(一个或多个) ”和“
操作窗口(一个或多个) 由”意思是在“ 游戏序列 ”中具有相同的 序列步骤 (避免 使用“游戏事件”与“动作窗口”无关 )。

施玛

+--------------+ 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, ... )

我还为名为“ 游戏值 ”的“ 游戏事件 ”和“ 动作窗口 ”引入了一个通用实体,可用于包含在“ 游戏序列
”中。这种概括可以表示一种游戏不变性的值(在我们的示例中为2种不同类型,但可扩展),因此选择了命名(已从“ 游戏化的对象 ”和“ 游戏可观察的”转换)。

游戏值(S) 这两种类型的”是“ 一起台阶 中的” 游戏序列 由平等的装置(gseq_id,seq_step)在一对gaming_sequence_detail(人们可以说,这种“的 配对
”是一个关系;这种溶液的作用更像在一个顺序步骤中代表 同胞 ,也允许扩展到两种以上的“ 游戏价值 ”)。

游戏序列细节中的游戏事件 ”和“ 动作窗口 ”可以独立修改,也可以显示为“ 未配对 ”。

其中的一个约束gaming_sequence_detail是,每个seq_step值都可以存在一个game_event和一个action_window,因此seq_step单个gseq_id值的最大基数为2。

如果是这样,相同的内容gaming_value也可能会以相同的顺序出现多次。此外,该设计还可以表示不同的 “游戏阶段玩法” 之间的共享序列。

2021-05-23