Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Relacionamento SQL muitos para muitos entre várias tabelas


Sim, tudo lá parece bem. Mas...

Algumas notas:

Usaríamos um tipo de dados mais curto para o gender coluna; Não vejo que precisaríamos de 255 caracteres para expressar isso. (Há um limite no tamanho máximo de uma linha que é aplicada.) Se houver apenas alguns valores para isso, consideraremos ENUM tipo de dados.

Provavelmente também adicionaríamos NOT NULL restrições em várias dessas colunas, como heroname, firstname, lastname. Provavelmente também adicionaríamos DEFAULT '' . Às vezes, realmente precisamos permitir valores NULL por algum motivo, mas usamos NOT NULL onde pudermos.

Estou hesitante sobre o TEXT colunas. Não há nada de errado em usar TEXT tipo de dados, mas estou apenas desconfiado de que eles possam estar "escondendo" algumas informações que podem ser melhor armazenadas em colunas adicionais.

Para as chaves estrangeiras, atribuiríamos um nome às restrições, seguindo o padrão que usamos, e provavelmente também adicionaríamos ON UPDATE CASCADE ON DELETE CASCADE
CONSTRAINT FK_superheroPower_power FOREIGN KEY (powerID) 
  REFERENCES power(id) ON UPDATE CASCADE ON DELETE CASCADE

Uma nota sobre identificadores (nomes de tabelas e nomes de colunas)

Do jeito que fazemos, todos os nomes das tabelas são minúsculas . (Nós temos um conjunto de opções MySQL que força todos os nomes de tabelas para letras minúsculas.) Fazemos isso para evitar problemas de incompatibilidade para diferentes sistemas operacionais/sistemas de arquivos (alguns dos quais diferenciam maiúsculas de minúsculas e outros não).

Além disso, os nomes das tabelas são singulares . O nome da tabela nomeia o que uma linha da tabela representa. Também não incluímos _table como parte do nome.

Os nomes das colunas no MySQL nunca diferenciam maiúsculas de minúsculas, mas sempre usamos letras minúsculas para os nomes das colunas também. Nós não "camelCase" nossos nomes de colunas, usamos caracteres de sublinhado como separadores, por exemplo power_id vs. powerID , hero_name vs. heroName .

ACOMPANHAMENTO

Minhas "notas" acima não são regras específicas que devem ser seguidas; esses são apenas padrões que usamos.

Seguir esses padrões não garante que teremos um software de sucesso, mas nos ajuda.

Para sua referência, vou mostrar como ficariam essas mesas como um "primeiro corte" da nossa loja, como ilustração de outro padrão; isso não "do jeito certo", é apenas "um jeito" que escolhemos como equipe.
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;