I suggest a design that represents sequences of 'game events' and 'action windows', related each other by belonging to a same sequence in the same sequence step.
That is to say, introducing "gaming sequence" and "gaming sequence detail" entities, the junction table is avoided "by design", representing the shared sequencing fact of 'game event(s)' and 'action window(s)' by mean of having the same sequence step in a "gaming sequence" (avoidance due to the consideration that "A 'game event' is not related to an 'action window'").
SCHEMA
+--------------+ 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 |
| |
+-----------------+
PREFIXES
gph_ === game_phase_
gseq_ === gaming_sequence_
gv_ === gaming_value_
TABLES
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, ... )
I've also introduced a generalization entity for 'game event(s)' and 'action window(s)' named "gaming value", useful for being contained in a "gaming sequence". This generalization could represent a kind of gaming immutable value (of 2 different types in our case, but extensible) and so the chosen naming (had been switching from "gaming objectified" and "gaming observable").
'gaming value(s)' of the two types are "stepped together" in the gaming sequence by means of equality of the (gseq_id, seq_step)
pair in gaming_sequence_detail
(one could argue that this kind of "pairing" is a relationship; this kind of solution acts more like representing sibilings in a sequence step, permitting also to extend to more than 2 types of 'gaming values').
'game event(s)' and 'action window(s)' in a gaming sequence detail could be independently modified and also could appear "unpaired".
A constraint in gaming_sequence_detail
is that for every seq_step
value could exist one game_event
and one action_window
and so the maximum cardinality of seq_step
for a single gseq_id
is 2.
If it's the case, the same gaming_value
could also appear more than once in the same sequence. Moreover this design could also represent shared sequences between different 'game phase play(s)'.