Una carta è un valore, non un'entità.
Le carte non hanno identità - se il pacchetto contiene due carte con lo stesso valore non è interessante identificarle separatamente. Hanno solo valore.
I linguaggi di programmazione tendono a fornire valori come integer, string e struct. Devi scegliere uno di quelli per rappresentare il valore di una carta. Suggerirei di usare un intero per il valore e scrivere una classe in grado di convertire tale numero intero da e verso la rappresentazione di stringa o immagine e di restituire il rango, il seme e l'ordine (che potrebbe non essere uguale all'ordine intero).
Quindi il generatore genera semplicemente numeri interi all'interno di un intervallo specificato.
Il solito mazzo di carte contiene 53 carte distinte, incluso un Jolly. Ci sono giochi (500) che hanno fino a 63 carte distinte ma il principio è lo stesso, e un intero è un modo perfettamente conveniente per codificare il valore. Lo userei anche nel database.
Per una mano o un affare hai più carte, fino a 13 in Bridge o 52 se vuoi mantenere un accordo completo. Potresti codificarlo come un elenco separato da spazi di interi o in un altro modo, a seconda di ciò che ti serve. Sta scendendo dal punto originale.
Per chiarezza, non suggerisco per un momento che si debbano usare interi effettivi nel codice per rappresentare le carte. In Java o JavaScript vorrei usare una classe, in C # o C ++ una struct. Il problema è che un oggetto ha identità, ma vogliamo occuparci dei valori. Vogliamo due diversi oggetti di carte che hanno lo stesso valore per essere uguali. Il modo più semplice (ma non l'unico modo) per farlo è che l'oggetto della carta contenga un numero intero in modo che due carte con lo stesso valore intero abbiano lo stesso valore. Questo viene fatto implementando un operatore 'Confronta uguale' nella classe che confronta il valore intero.
Questo è un problema sottile, la rappresentazione dei tipi di valore, e non è facilmente indirizzabile con un pubblico con competenze molto diverse.