Question

Je ne sais pas vraiment si cela est possible ou si cela entre dans la catégorie des tableaux croisés dynamiques, mais j'ai pensé que j'irais voir les pros pour voir.

J'ai trois tables de base:Carte, Propriété et CardProperty.Étant donné que les cartes n'ont pas les mêmes propriétés, et souvent plusieurs valeurs pour la même propriété, j'ai décidé d'utiliser l'approche de la table d'union pour stocker les données au lieu d'avoir une très grande structure de colonnes dans ma table de cartes.

La table des propriétés est une table de base de types de mots-clés/valeurs.Vous avez donc le mot-clé ATK et la valeur qui lui est attribuée.Il existe une autre propriété appelée SpecialType pour laquelle une carte peut avoir plusieurs valeurs, telles que "Sycnro" et "DARK".

Ce que j'aimerais faire, c'est créer une vue ou une procédure stockée qui me donne l'identifiant de la carte, le nom de la carte et tous les mots-clés de propriété attribués à la carte sous forme de colonnes et leurs valeurs dans le ResultSet pour une carte spécifiée.Donc, idéalement, j'aurais un résultat comme :

ID  NAME                   SPECIALTYPE
1   Red Dragon Archfiend   Synchro
1   Red Dragon Archfiend   DARK
1   Red Dragon Archfiend   Effect

et je pourrais compter mes résultats de cette façon.

Je suppose que ce serait encore plus astucieux de simplement concaténer les propriétés ensemble en fonction de leur mot-clé, afin de pouvoir générer un ResultSet comme :

1  Red Dragon Archfiend   Synchro/DARK/Effect

..mais je ne sais pas si c'est faisable.

Aidez-moi à stackoverflow Kenobi !Tu es mon seul espoir.

Autres conseils

Liés mais les valeurs sont conservées dans des colonnes séparées et vous connaissez vos "types spéciaux" à l'avance :
Requête SQL pour comparer les ventes de produits par mois

Sinon, je ferais cela avec le curseur dans une procédure stockée ou effectuerais la transformation dans la couche métier ou présentation.

Essayez SQL si vous connaissez tous les cas :

Select
    ID,NAME
    ,Synchro+DARK+Effect --  add a some substring logic to trim any trailing /'s
from
    (select
        ID
        ,NAME
        --may need to replace max() with min().
        ,MAX(CASE SPECIALTYPE WHEN "Synchro" THEN SPECIALTYPE +"/" ELSE "" END) Synchro
        ,MAX(CASE SPECIALTYPE WHEN "DARK" THEN SPECIALTYPE +"/" ELSE "" END) DARK
        ,MAX(CASE SPECIALTYPE WHEN "Effect" THEN SPECIALTYPE ELSE "" END) Effect
    from
        table
    group by
       ID
       ,NAME) sub1

Ne réduisez pas par concaténation pour le stockage des enregistrements associés dans votre base de données.Ce ne sont pas exactement les meilleures pratiques.

Ce que vous décrivez est un tableau croisé dynamique.Les tableaux croisés dynamiques sont dur.Je suggérerais de les éviter si possible.

Pourquoi ne pas simplement lire vos lignes associées et les traiter en mémoire ?Il ne semble pas que vous alliez passer trop de millisecondes à faire ça...

Une option consiste à ce que les propriétés aient un PropertyType, donc :

table cards
integer ID | string name | ... (other properties common to all Cards)

table property_types
integer ID | string name | string format | ... (possibly validations)

table properties
integer ID | integer property_type_id | string name | string value
foreign key property_type_id references property_types.ID

table cards_properties
integer ID | integer card_id | integer property_id
foreign key card_id references cards.ID
foreign key property_id references propertiess.ID

De cette façon, lorsque vous souhaitez définir une nouvelle valeur de propriété, vous pouvez la valider par son type.Un type pourrait être « SpecialType » avec une énumération de valeurs.

J'ai un type/format pour ma table de propriétés, de cette façon je sais comment convertir/évaluer lorsque j'ai affaire à une valeur entière.Je ne savais pas si c'était pertinent ou non pour ce problème.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top