Sto cercando di unire tabelle in cui le righe corrispondono a un rapporto molti: 1 con cose "reali".Unione di tabelle complesse
Sto scrivendo un simulatore di blackjack che memorizza la cronologia di gioco in un database con una nuova serie di tabelle generate ogni corsa. I tavoli sono molto più simili a modelli, dal momento che ogni gioco ottiene il proprio set dei 3 tavoli mutabili (giocatori, mani e partite). Ecco il layout, in cui suff è un suffisso specificato dall'utente da utilizzare per l'esecuzione corrente:
- cards
- id INTEGER PRIMARY KEY
- cardValue INTEGER NOT NULL
- suit INTEGER NOT NULL
- players_suff
- whichPlayer INTEGER PRIMARY KEY
- aiType TEXT NOT NULL
- hands_suff
- id BIGSERIAL PRIMARY KEY
- whichPlayer INTEGER REFERENCES players_suff(whichPlayer) *
- whichHand BIGINT NOT NULL
- thisCard INTEGER REFERENCES cards(id)
- matches_suff
- id BIGSERIAL PRIMARY KEY
- whichGame INTEGER NOT NULL
- dealersHand BIGINT NOT NULL
- whichPlayer INTEGER REFERENCES players_suff(whichPlayer)
- thisPlayersHand BIGINT NOT NULL **
- playerResult INTEGER NOT NULL --AKA who won
Solo una tabella carte è creato perché i suoi valori sono costanti.
Così, dopo aver eseguito il simulatore per due volte si potrebbe avere:
hands_firstrun
players_firstrun
matches_firstrun
hands_secondrun
players_secondrun
matches_secondrun
Voglio essere in grado di combinare queste tabelle se è stato utilizzato gli stessi parametri di AI per entrambe le corse (cioè players_firstrun e players_secondrun sono esattamente le stesso). Il problema è che il modo in cui sto inserendo le mani rende questo molto disordinato: cheHand non può essere un BIGSERIAL perché la relazione tra le righe hands_suff e "mani effettive" è molte: 1. matches_suff è gestito allo stesso modo perché un "gioco" di blackjack consiste in realtà in un insieme di giochi: l'insieme di coppie di ogni giocatore contro il mazziere. Quindi per 3 giocatori, hai effettivamente 3 file per ogni round.
Attualmente seleziono il più grande cheHand nella tabella, aggiungi 1 ad esso, quindi inserisco tutte le righe per una mano. Sono preoccupato che questo "query-and-insert" sarà molto lento se sto unendo 2 tabelle che potrebbero essere entrambe arbitrariamente enormi.
Quando sto unendo le tabelle, ho la sensazione che dovrei essere in grado di interrogare (interamente in SQL) i valori più grandi in cuiHand e whichGame una volta li utilizzano combinando le tabelle, incrementandole per ogni unique whichHand e whichGame nel tabella che viene unita.
(Ho visto this question, ma non gestisce l'utilizzo di un ID generato in 2 posizioni diverse). Sto usando Postgres ed è OK se la risposta è specifica.
* sadly postgres non consente nomi di tabelle con parametri, quindi è necessario eseguire la sostituzione manuale delle stringhe. Non è la fine del mondo, dal momento che il programma non è rivolto al Web e nessuno, tranne me, probabilmente si preoccupa di farlo, ma la vulnerabilità di SQL injection non mi rende felice.
** matches_suff (whichPlayersHand) originariamente stava per fare riferimento a hands_suff (whichHand) ma foreign keys must reference unique values. whichHand non è univoco perché una mano è composta da più righe, ogni riga "tiene" una sola carta. Per eseguire una query per una mano, seleziona tutte quelle righe con lo stesso valore in cuiHand. Non riuscivo a pensare a un modo più elegante per farlo senza ricorrere agli array.
EDIT:
Questo è quello che ho adesso:
thomas=# \dt
List of relations
Schema | Name | Type | Owner
--------+----------------+-------+--------
public | cards | table | thomas
public | hands_first | table | thomas
public | hands_second | table | thomas
public | matches_first | table | thomas
public | matches_second | table | thomas
public | players_first | table | thomas
public | players_second | table | thomas
(7 rows)
thomas=# SELECT * FROM hands_first
thomas-# \g
id | whichplayer | whichhand | thiscard
----+-------------+-----------+----------
1 | 0 | 0 | 6
2 | 0 | 0 | 63
3 | 0 | 0 | 41
4 | 1 | 1 | 76
5 | 1 | 1 | 23
6 | 0 | 2 | 51
7 | 0 | 2 | 29
8 | 0 | 2 | 2
9 | 0 | 2 | 92
10 | 0 | 2 | 6
11 | 1 | 3 | 101
12 | 1 | 3 | 8
(12 rows)
thomas=# SELECT * FROM hands_second
thomas-# \g
id | whichplayer | whichhand | thiscard
----+-------------+-----------+----------
1 | 0 | 0 | 78
2 | 0 | 0 | 38
3 | 1 | 1 | 24
4 | 1 | 1 | 18
5 | 1 | 1 | 95
6 | 1 | 1 | 40
7 | 0 | 2 | 13
8 | 0 | 2 | 84
9 | 0 | 2 | 41
10 | 1 | 3 | 29
11 | 1 | 3 | 34
12 | 1 | 3 | 56
13 | 1 | 3 | 52
thomas=# SELECT * FROM matches_first
thomas-# \g
id | whichgame | dealershand | whichplayer | thisplayershand | playerresult
----+-----------+-------------+-------------+-----------------+--------------
1 | 0 | 0 | 1 | 1 | 1
2 | 1 | 2 | 1 | 3 | 2
(2 rows)
thomas=# SELECT * FROM matches_second
thomas-# \g
id | whichgame | dealershand | whichplayer | thisplayershand | playerresult
----+-----------+-------------+-------------+-----------------+--------------
1 | 0 | 0 | 1 | 1 | 0
2 | 1 | 2 | 1 | 3 | 2
(2 rows)
mi piacerebbe combinare in modo da avere:
hands_combined table:
id | whichplayer | whichhand | thiscard
----+-------------+-----------+----------
1 | 0 | 0 | 6 --Seven of Spades
2 | 0 | 0 | 63 --Queen of Spades
3 | 0 | 0 | 41 --Three of Clubs
4 | 1 | 1 | 76
5 | 1 | 1 | 23
6 | 0 | 2 | 51
7 | 0 | 2 | 29
8 | 0 | 2 | 2
9 | 0 | 2 | 92
10 | 0 | 2 | 6
11 | 1 | 3 | 101
12 | 1 | 3 | 8
13 | 0 | 4 | 78
14 | 0 | 4 | 38
15 | 1 | 5 | 24
16 | 1 | 5 | 18
17 | 1 | 5 | 95
18 | 1 | 5 | 40
19 | 0 | 6 | 13
20 | 0 | 6 | 84
21 | 0 | 6 | 41
22 | 1 | 7 | 29
23 | 1 | 7 | 34
24 | 1 | 7 | 56
25 | 1 | 7 | 52
matches_combined table:
id | whichgame | dealershand | whichplayer | thisplayershand | playerresult
----+-----------+-------------+-------------+-----------------+--------------
1 | 0 | 0 | 1 | 1 | 1
2 | 1 | 2 | 1 | 3 | 2
3 | 2 | 4 | 1 | 5 | 0
4 | 3 | 6 | 1 | 7 | 2
Ogni valore di "thiscard" rappresenta un gioco carta nella gamma [1..104] - 52 carte da gioco con un bit in più che rappresenta se è a faccia in su o a faccia in giù. Non ho pubblicato la tabella reale per motivi di spazio. Quindi il giocatore 0 (ovvero il mazziere) aveva una mano di (Seven of Spades, Queen of Spaces, 3 of Clubs) nel primo gioco.
Qualcuno potrebbe spiegare il downgrade in modo da poter modificare la domanda? – Prime
puoi scrivere esempi di dati che hai e i dati di cui hai bisogno. Puoi anche dare la tua domanda esistente. –
Cosa dovrebbe apparire la tabella risultante lik (ovvero il risultato della combinazione)? A proposito, perché sei arrivato con uno zoo di tavoli e non hai aggiunto un 'game_id' (avresti potuto usare il valore' suff 'attuale come valore lì) per distinguere le voci che si riferiscono. Il modo attuale è un grave abuso della logica del database SQL. – rpy