Come conservare elementi ordinabili di diverso tipo

1

Ho "liste" che contengono oggetti diversi a volte con classi simili, a volte con classi diverse.

Quindi ho una tabella "liste" per memorizzare una lista. Ho una tabella 'strange_objects' per memorizzare uno strano oggetto e una tabella 'regular_object' per memorizzare un oggetto regolare.

Ora voglio che una lista abbia diversi oggetti in ordine. Quale schema avrebbe più senso?

Stavo pensando alla lista che ha list_objects (con un ordine, type e type_id) per fare riferimento all'oggetto in quella posizione nella lista. Tuttavia sono un po 'insicuro se questa sarebbe una bella struttura dato che ho sempre bisogno di fare un join se voglio solo recuperare tutti gli oggetti per un elenco o ottenere tutti gli' oggetti regolari 'nel mio elenco.

Quale struttura consiglieresti di conservare i miei oggetti?

Quello che stavo pensando è il seguente (gli FK erano rimasti fuori per ora)

-- Create syntax for TABLE 'list_items'
CREATE TABLE 'list_items' (
  'id' int(11) unsigned NOT NULL AUTO_INCREMENT,
  'order' int(11) NOT NULL,
  'list_id' int(11) unsigned DEFAULT NULL,
  PRIMARY KEY ('id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

-- Create syntax for TABLE 'lists'
CREATE TABLE 'lists' (
  'id' int(11) unsigned NOT NULL AUTO_INCREMENT,
  'name' varchar(11) COLLATE utf8mb4_bin NOT NULL DEFAULT '',
  PRIMARY KEY ('id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

-- Create syntax for TABLE 'regular_objects'
CREATE TABLE 'regular_objects' (
  'id' int(11) unsigned NOT NULL AUTO_INCREMENT,
  'list_item_id' int(11) DEFAULT NULL,
  'name' varchar(100) COLLATE utf8mb4_bin DEFAULT NULL,
  'question' varchar(100) COLLATE utf8mb4_bin DEFAULT NULL,
  PRIMARY KEY ('id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

-- Create syntax for TABLE 'strange_objects'
CREATE TABLE 'strange_objects' (
  'id' int(11) unsigned NOT NULL AUTO_INCREMENT,
  'list_item_id' int(11) DEFAULT NULL,
  'duration' int(11) DEFAULT NULL,
  'data' mediumblob,
  PRIMARY KEY ('id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
    
posta Roderik 19.06.2018 - 20:47
fonte

1 risposta

0

Penso che tu sia vicino. Avrei liste, con list_items come tabella di bridging e gli oggetti.

La tabella di bridging avrebbe list_id, item_id e order. Dovrebbe anche avere idealmente una chiave primaria unica e separata. Questo approccio consentirebbe di riutilizzare gli oggetti in elenchi diversi. O anche più volte in una lista.

Lo svantaggio è che non si poteva avere un vincolo di chiave esterna sulle tabelle degli oggetti a meno che non si avesse un campo per ognuno nella tabella di bridging.

Un'altra possibilità è combinare le tabelle degli oggetti e differenziare con una bandiera. Le colonne possono essere nulle se l'attributo non si applica. Questo dovrebbe essere piuttosto semplice a meno che non ci siano dipendenze o regole tra i tipi di oggetto.

    
risposta data 22.06.2018 - 11:30
fonte

Leggi altre domande sui tag