Mysql
 sql >> Base de données >  >> RDS >> Mysql

Relation plusieurs à plusieurs SQL entre plusieurs tables

Oui, tout semble correct. Mais...

Quelques remarques :

Nous utiliserions un type de données plus court pour le gender colonne; Je ne vois pas que nous aurions besoin de 255 caractères pour exprimer cela. (Il y a une limite à la taille maximale d'une ligne qui est appliquée.) S'il n'y a que quelques valeurs pour cela, nous considérerons ENUM type de données.

Nous ajouterions aussi probablement NOT NULL contraintes sur plusieurs de ces colonnes, telles que heroname, firstname, lastname. Nous ajouterions aussi probablement DEFAULT '' . Parfois, nous devons vraiment autoriser les valeurs NULL pour une raison quelconque, mais nous utilisons NOT NULL partout où nous pouvons.

J'hésite à propos du TEXT Colonnes. Il n'y a rien de mal à utiliser TEXT type de données, mais je soupçonne simplement que ceux-ci peuvent "cacher" certaines informations qu'il serait préférable de stocker dans des colonnes supplémentaires.

Pour les clés étrangères, nous attribuerions un nom aux contraintes, en suivant le modèle que nous utilisons, et ajouterions probablement ON UPDATE CASCADE ON DELETE CASCADE

CONSTRAINT FK_superheroPower_power FOREIGN KEY (powerID) 
  REFERENCES power(id) ON UPDATE CASCADE ON DELETE CASCADE

Remarque sur les identifiants (noms de table et noms de colonne)

La façon dont nous le faisons, tous les noms de table sont en minuscules . (Nous avons un ensemble d'options MySQL qui force tous les noms de table en minuscules.) Nous faisons cela pour éviter les problèmes d'incompatibilité pour différents systèmes d'exploitation/systèmes de fichiers (dont certains sont sensibles à la casse, et d'autres non).

De plus, les noms de table sont singuliers . Le nom de la table nomme quoi une ligne du tableau représente. Nous n'incluons pas non plus _table dans le cadre du nom.

Les noms de colonne dans MySQL ne sont jamais sensibles à la casse, mais nous utilisons toujours des minuscules pour les noms de colonne également. Nous ne mettons pas en "camelCase" nos noms de colonnes, nous utilisons le caractère de soulignement comme séparateurs, par ex. power_id vs powerID , hero_name vs heroName .

SUIVI

Mes "notes" ci-dessus ne sont pas des règles spécifiques qui doivent être suivies ; ce ne sont que des modèles que nous utilisons.

Suivre ces modèles ne garantit pas que nous aurons un logiciel performant, mais cela nous aide.

Pour votre référence, je vais vous montrer à quoi ressembleraient ces tables comme une "première coupe" de notre boutique, comme illustration d'un autre modèle; ce n'est pas "le bon chemin", c'est juste "un chemin" que nous avons choisi en équipe.

CREATE TABLE superhero
( id               INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'pk'
, hero_name        VARCHAR(255) NOT NULL                COMMENT ''
, first_name       VARCHAR(255) NOT NULL DEFAULT ''     COMMENT ''
, last_name        VARCHAR(255) NOT NULL DEFAULT ''     COMMENT ''
, first_appearance DATE                                 COMMENT 'date superhero first appeared'
, gender           ENUM('female','male','other')        COMMENT 'female,male or other'
, biography_text   TEXT                                 COMMENT ''
, universe         VARCHAR(255)                         COMMENT ''
, PRIMARY KEY(id)
, UNIQUE KEY superhero_UX1 (hero_name) 
) ENGINE=InnoDB;

CREATE TABLE power
( id               INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'pk'
, name             VARCHAR(255) NOT NULL                COMMENT ''  
, description_text TEXT NOT NULL                        COMMENT '' 
, PRIMARY KEY(id)
, UNIQUE KEY power_UX1 (name)
) ENGINE=InnoDB;

CREATE TABLE superheropower
( superhero_id   INT UNSIGNED NOT NULL         COMMENT 'pk, fk ref superhero'
, power_id       INT UNSIGNED NOT NULL         COMMENT 'pk, fk ref power'
, PRIMARY KEY(superhero_id, power_id)
, CONSTRAINT FK_superheropower_superhero 
     FOREIGN KEY(superhero_id) REFERENCES superhero(id)
     ON UPDATE CASCADE ON DELETE CASCADE
, CONSTRAINT FK_superheropower_power
     FOREIGN KEY (power_id) REFERENCES power(id) 
     ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB;