2016-11-01 1 views
0

Je suis en train de programmer un site qui stocke des données de session de poker. Une session est une période de temps passée dans un casino en train de jouer au poker. Une session contient des informations telles que la date/l'heure, le bénéfice net/la perte de la session et l'endroit où ils ont joué. Cependant, la partie que je suis confus est de savoir comment gérer une session type. Au poker, il existe deux types de jeux: les cash games et les tournois. Chacun a ses propres champs spécifiques pertinents seulement pour eux. Voici un exemple de table (je l'ai enlevé les champs non pertinents):Comment normaliser cette table de base de données non normalisée?

+----+--------------+--------+--------+ 
| id | session type | stakes | buy-in | 
+----+--------------+--------+--------+ 
| 1 | cash   | 1/3 NL | NULL | 
| 2 | cash   | 1/2 NL | NULL | 
| 3 | tournament | NULL | $20 | 
+----+--------------+--------+--------+ 

Comme vous pouvez le voir, je ne ai pas besoin buy-in si le type de session est l'argent. De même, si le type de session est tournoi, je n'ai pas besoin du champ stakes.

Comment pourrais-je aller sur ma table normalisant telle que je n'ai pas les champs NULL? Du point de vue des performances, mon application va-t-elle souffrir si je normalise cette table juste pour que je n'aie pas de valeur NULL dans ma rangée?

+0

laisser un champ avec un taux de nom/rang ou quelque chose –

+0

J'aime la première réponse de Lashane, mais si la seule différence est une colonne et tout est déjà écrit ailleurs, je voudrais juste vous assurer session_type est un index et se déplacent sur à autre chose.Normalement, il n'y aura pas d'énorme gain de performance si vous n'avez pas des millions de lignes – CptMisery

+0

Votre table actuelle est normalisée, c'est une implémentation d'une relation "is-a". La première solution de Lashanes est une autre façon de mettre en œuvre une relation «est-a». Les valeurs 'null' dans votre implémentation sont parfaitement correctes (et permises dans la normalisation), et vous les récupérerez quand vous faites un' select * à partir des sessions à gauche rejoindre cash_sessions sur ... left rejoindre tournament_session sur ... ', qui est la requête standard pour faire n'importe quoi avec vos données. Il sera plus lent (à cause de la jointure), mais sauvegardera un peu de stockage (sur hdd (moins important) et en ram (un peu plus important, bien que la jointure nécessite aussi le ram)). – Solarflare

Répondre

2

Voici une solution possible:

sessions:

id_session (PK) 
session_type (Integer/Enum) 

cash_sessions:

id_session (FK) 
stakes 

tournament_sessions:

id_session (FK) 
buy_in 

Ainsi, une table séparée pour chaque type de session, ainsi vous serez en mesure de définir différentes colonnes pour différents types, ont également des colonnes communes dans sessions tableau

données Exemple:

sessions 
1 1 
2 1 
3 2 

cash_sessions 
1 1/3 NL 
2 1/2 NL 

tournament_sessions 
3 $20 

Une autre solution :

sessions:

id_session (PK) 
session_type (Integer/Enum) <- basically useless field for this schema 

attributs:

id_attr (PK) 
name (String) 

session_attributes:

id_session (FK) 
id_attr(FK) 
value (String) 

donc, au lieu de penser en termes de "type de session", vous pouvez changer votre modèle d'affaires à penser à "attributs de session" , donc, différentes sessions peuvent avoir différents ensembles d'attributs assignés

données Exemple:

sessions 
1 1 
2 1 
3 2 

attributes 
1 stakes 
2 buy_in 

session_attributes 
1 1 1/3 NL 
2 1 1/2 NL 
3 2 $20