Domanda

Non sono del tutto sicuro che ciò sia possibile o che rientri nella categoria delle tabelle pivot, ma ho pensato di andare dai professionisti per vedere.

Ho tre tabelle di base:Carta, Proprietà e CardProperty.Poiché le carte non hanno le stesse proprietà e spesso più valori per la stessa proprietà, ho deciso di utilizzare l'approccio della tabella di unione per archiviare i dati invece di avere una struttura di colonne molto grande nella mia tabella delle carte.

La tabella delle proprietà è una tabella di tipo parola chiave/valore di base.Quindi hai la parola chiave ATK e il valore ad essa assegnato.Esiste un'altra proprietà chiamata SpecialType per la quale una carta può avere più valori, come "Sycnro" e "DARK"

Quello che mi piacerebbe fare è creare una vista o una procedura memorizzata che mi fornisca l'ID della carta, il Nome della carta e tutte le parole chiave delle proprietà assegnate alla carta come colonne e i relativi valori nel ResultSet per una carta specificata.Quindi idealmente avrei un set di risultati come:

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

e potrei contare i miei risultati in questo modo.

Immagino che sarebbe ancora più astuto semplicemente concatenare le proprietà insieme in base alla loro parola chiave, in modo da poter generare un ResultSet come:

1  Red Dragon Archfiend   Synchro/DARK/Effect

..ma non so se è fattibile.

Aiutami a stackoverflow Kenobi!Sei la mia unica speranza.

È stato utile?

Altri suggerimenti

Correlati ma i valori sono mantenuti in colonne separate e tu conosci i tuoi "tipi speciali" in anticipo:
Query SQL per confrontare le vendite di prodotti per mese

Altrimenti lo farei con il cursore in una procedura memorizzata o preformerei la trasformazione nel livello aziendale o di presentazione.

Stab su sql se conosci tutti i casi:

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

Non comprimere per concatenazione per l'archiviazione dei record correlati nel database.Non sono esattamente le migliori pratiche.

Quella che stai descrivendo è una tabella pivot.Le tabelle pivot lo sono difficile.Suggerirei di evitarli se possibile.

Perché non leggere semplicemente le righe correlate ed elaborarle in memoria?Non sembra che spenderai troppi millisecondi per farlo...

Un'opzione è fare in modo che le proprietà abbiano un PropertyType, quindi:

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

In questo modo, quando desideri impostare un nuovo valore di proprietà, puoi convalidarlo in base al tipo.Un tipo potrebbe essere "SpecialType" con un'enumerazione di valori.

Ho un tipo/formato per la mia tabella delle proprietà, in questo modo so come eseguire il cast/valutare quando ho a che fare con un valore intero.Non ero sicuro se fosse pertinente a questo problema o meno.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top