0

Je pourrais vraiment utiliser de bons commentaires sur les meilleures pratiques/idées pour savoir s'il vaut mieux mettre des choses dans la base de données, ou construire un tableau. Prenez par exemple vous avez les combinaisons de cartes:Tableau ou tableau de base de données?

$suits = array('clubs', 'spades', 'hearts', 'diamonds'); 

Le tableau pourrait changer dans le futur, mais pas très fréquemment si pas du tout. Maintenant, ces combinaisons sont appliquées aux cartes dans un jeu de cartes. Donc, si je construis une table, le schéma ressemblerait à quelque chose comme:

create table cards { 
    id INT(11) 
    card_value char(2), 
    suit varchar(8) 
} 

Ou est-il préférable de construire une table suits et référence la ID dans le tableau cards comme:

create table suits { 
    id INT(11), 
    name varchar(8) 
} 

create table cards { 
    id INT(11), 
    suit_id int(11), 
    card_value char(2) 
} 

Quelle est la meilleure façon d'y aller et pourquoi?

Répondre

2

Après avoir lu vos commentaires à la réponse de Will Je sais Complets et cartes n'a pas été votre premier choix d'exemple, mais je vais poursuivre l'exemple de toute façon :)

Je suis d'accord, il est peu probable que les valeurs de costumes sont va changer, sauf si vous voulez un système suffisamment flexible pour gérer les cartes de Tarot (Epées, Portées, Coupes et Pièces). Néanmoins, il y a des avantages à conserver les données dans un tableau.

Le premier est que le costume est utilisé à plusieurs endroits. Les jeux de cartes comme Bridge et Whist doivent savoir quel Suit est l'emporte sur. Coeurs (Black Maria, Chase the Lady) est un jeu qui doit être capable de distinguer les cartes de certains costumes qui portent des pénalités. Donc, il y a plusieurs endroits où le référencement de SUITS.ID serait utile.

Le second avantage est que Suits a plus d'attributs que de noms. Certains jeux classent des costumes, par exemple dans Bridge une enchère de Three Spades gagne par-dessus une enchère de Three Hearts. Si nous construisons une application de jeu de cartes, nous pourrions associer un fichier image ou un personnage winging pour représenter le symbole de la carte.

Ces deux considérations pointent vers votre deuxième conception. C'est le seul qui évite la duplication et nous permet d'imposer des contraintes d'intégrité.

+0

Cela aide beaucoup! Cela m'aide à voir que si un réseau fonctionne, il ne s'agit pas seulement des besoins immédiats. Pour une meilleure extensibilité, il est préférable de placer les données dans la base de données (quelle que soit leur taille), car elles seront probablement utilisées ailleurs dans l'application. Et il est préférable de l'avoir accessible à partir de la base de données, que codé en dur quelque part. Merci d'avoir ouvert mon esprit! –

3

Généralement, je dirais qu'il vaut mieux stocker les informations dans la base de données, bien que dans l'exemple des cartes je serais tenté soit d'avoir les informations en code et de stocker un 'numéro de carte' calculé à partir de (suit_idx * 13 + card_value), ou utilisez la table des cartes que vous avez donnée dans votre deuxième fragment de code - car les cartes sont très peu susceptibles de changer (surtout une fois que vous avez commencé à les utiliser dans le code). À la fin de la journée, si vous effectuez des requêtes par rapport à, par exemple, 'mains' de cartes, ou contre un jeu de cartes dans la base de données, alors vous allez vouloir utiliser l'une de vos représentations SQL - avec le premier étant juste un peu plus facile à interroger (bien qu'avec une vue qui joint la carte à costume, l'une ou l'autre option est facile à interroger - bien que je serais toujours tenté de coller avec la première version de SQL).

+0

Oui, je ne pouvais pas penser à un meilleur exemple. C'est plus sur les costumes que sur les chiffres. Mais n'est-ce pas ainsi que cela se passe habituellement? J'aurais dû rester avec l'idée originale des couleurs aux voitures. Doh! –

+0

Les couleurs des voitures que vous stockez définitivement dans la base de données - vous obtiendrez potentiellement de nouvelles voitures tout le temps - et elles seront toujours capables d'imaginer de nouvelles couleurs - ainsi votre seconde représentation SQL - normalisée - est la un pour aller ici. :) –

+1

Ce n'est pas un problème de normalisation.Dans le premier tableau, il n'y a rien de fonctionnellement dépendant de la colonne 'suit'. Si la première table avait une autre colonne appelée «couleur», elle ne serait pas normalisée. –

Questions connexes