sql >> Base de Datos >  >> RDS >> Mysql

Relación SQL de muchos a muchos entre varias tablas

Sí, todo allí se ve bien. Pero...

Algunas notas:

Usaríamos un tipo de datos más corto para el gender columna; No veo que necesitemos 255 caracteres para expresar eso. (Hay un límite en el tamaño máximo de una fila que se aplica). Si solo hay unos pocos valores para eso, consideraríamos ENUM tipo de datos.

También es probable que agreguemos NOT NULL restricciones en varias de esas columnas, como heroname, firstname, lastname. También es probable que agreguemos DEFAULT '' . A veces, realmente necesitamos permitir valores NULL por alguna razón, pero usamos NOT NULL dondequiera que podamos.

Dudo sobre el TEXT columnas No hay nada de malo en usar TEXT tipo de datos, pero sospecho que esos pueden estar "ocultando" alguna información que podría almacenarse mejor en columnas adicionales.

Para las claves foráneas, asignaríamos un nombre a las restricciones, siguiendo el patrón que usamos, y probablemente también agregaríamos ON UPDATE CASCADE ON DELETE CASCADE

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

Una nota sobre los identificadores (nombres de tablas y nombres de columnas)

De la forma en que lo hacemos, todos los nombres de las tablas son minúsculas . (Tenemos un conjunto de opciones de MySQL que obliga a que todos los nombres de las tablas estén en minúsculas). Hacemos esto para evitar problemas de incompatibilidad para diferentes sistemas operativos/sistemas de archivos (algunos de los cuales distinguen entre mayúsculas y minúsculas y otros no).

Además, los nombres de las tablas son singular . El nombre de la tabla nombra qué una fila de la tabla representa. Tampoco incluimos _table como parte del nombre.

Los nombres de las columnas en MySQL nunca distinguen entre mayúsculas y minúsculas, pero siempre usamos minúsculas para los nombres de las columnas también. No "camelCase" nuestros nombres de columna, usamos caracteres de subrayado como separadores, p. power_id frente a powerID , hero_name contra heroName .

SEGUIMIENTO

Mis "notas" anteriores no son reglas específicas que deben seguirse; Esos son solo patrones que usamos.

Seguir estos patrones no garantiza que tengamos un software exitoso, pero nos ayuda.

Para su referencia, mostraré cómo se verían estas tablas como un "primer corte" de nuestra tienda, como ilustración de otro patrón; esto es no "la manera correcta", es solo "una manera" que hemos establecido como equipo.

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;