2013-01-23 5 views
1

J'essaie de créer un programme en C++ qui analyse les mains de poker. Je voudrais utiliser SQL pour stocker des données sur les mains, les joueurs et les sessions. J'ai une bonne idée de ce que je voudrais stocker dans ma table de session et de joueur, mais la table de main est un peu plus rusée. Une main unique doit contenir le nom de tous les joueurs, leurs mains (si montré), leurs piles, la date, les enjeux et ainsi de suite. Le problème est avec la sauvegarde des événements. Une seule main à 6 joueurs pourrait être aussi simple que plier-plier-plier-plier-augmenter, 4 $ -plier, mais il pourrait être BEAUCOUP plus long. La seule façon que je peux penser à faire ceci est d'avoir une colonne appelée "Events" et de stocker l'action une chaîne, "F-F-F-F-R, 4-F".Stocker les événements d'un pokerhand dans une base de données

Il doit y avoir une meilleure façon, plus élégante de faire cela?

+1

Pour moi, cela ne semble pas être un problème que vous voudriez stocker dans une base de données relationnelle, mais plutôt une base de données NoSQL. –

+0

Cool Question !! - Ma première pensée (et je vais y réfléchir plus) est que puisqu'il n'y a que 3 options: 'Fold' /' Call'/'Raise' et' Fold' est le plus commun - Make Fold = 'NULL 'pour économiser de l'espace, réglez Call =' 0' et Raise = $$ amount ... Encore une fois, d'abord pensé à l'économie d'espace –

+0

Ensuite pensé - puisqu'il y a un maximum de 9 par table, peut-être avoir 9 champs - un pour chaque joueur - et dans un autre état de terrain qui est le concessionnaire ... –

Répondre

3

Le stockage d'une séquence d'événements sur une seule ligne constitue une violation de la première forme normale et est considérée comme une mauvaise pratique. Ainsi, au lieu de stocker toute la séquence d'événements dans une seule rangée pour la main, vous devriez avoir une séquence de rangées dans une autre table (John Bustos a suggéré "bets", mais votre nom de colonne suggéré "Events" pourrait faire un bon nom de table aussi) associé à celui-ci. Chaque événement contient l'identifiant de la main à laquelle il appartient, un numéro de séquence pour commander les événements. Ces deux colonnes formeraient la clé primaire de cette table. Ensuite, vous pouvez avoir une colonne pour stocker le type d'événement (un ENUM pourrait s'avérer utile pour cela) et pour certains événements des données supplémentaires comme un montant.

Pour lister tous les événements d'une requête, vous pouvez générer plusieurs lignes, une pour chaque événement. Ou vous avez une sous-requête qui transforme toutes ces lignes en texte, que vous pouvez ensuite agréger en une seule chaîne en utilisant GROUP_CONCAT.

Questions connexes