sql >> Database >  >> RDS >> Mysql

SQL Veel-op-veel-relatie tussen meerdere tabellen

Ja, daar ziet alles er goed uit. Maar...

Een paar opmerkingen:

We zouden een korter gegevenstype gebruiken voor het gender kolom; Ik zie niet in dat we 255 tekens nodig hebben om dat uit te drukken. (Er is een limiet voor de maximale grootte van een rij die wordt afgedwongen.) Als daar maar een paar waarden voor zijn, overwegen we ENUM gegevenstype.

We zouden waarschijnlijk ook NOT NULL . toevoegen beperkingen op verschillende van die kolommen, zoals heldennaam, voornaam, achternaam. We zouden waarschijnlijk ook DEFAULT '' . toevoegen . Soms moeten we om de een of andere reden echt NULL-waarden toestaan, maar we gebruiken NOT NULL waar we maar kunnen.

Ik twijfel over de TEXT kolommen. Er is niets mis met het gebruik van TEXT datatype, maar ik vermoed dat die informatie misschien "verbergen" die beter in extra kolommen kan worden opgeslagen.

Voor de externe sleutels zouden we een naam toewijzen aan de beperkingen, volgens het patroon dat we gebruiken, en waarschijnlijk ook toevoegen ON UPDATE CASCADE ON DELETE CASCADE

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

Een opmerking over identifiers (tabelnamen en kolomnamen)

Zoals we het doen, zijn alle tabelnamen kleine letters . (We hebben een MySQL-optie ingesteld die alle tabelnamen in kleine letters dwingt.) We doen dit om incompatibiliteitsproblemen voor verschillende besturingssystemen/bestandssystemen te voorkomen (waarvan sommige hoofdlettergevoelig zijn en andere niet).

Tabelnamen zijn ook enkelvoud . De naam van de tabel benoemt wat één rij van de tafel vertegenwoordigt. We nemen ook geen _table op als onderdeel van de naam.

Kolomnamen in MySQL zijn nooit hoofdlettergevoelig, maar we gebruiken ook altijd kleine letters voor de kolomnamen. We gebruiken onze kolomnamen niet "camelCase", we gebruiken onderstrepingstekens als scheidingstekens, b.v. power_id vs. powerID , hero_name vs. heroName .

VERVOLG

Mijn "opmerkingen" hierboven zijn geen specifieke regels die moeten worden gevolgd; dat zijn slechts patronen die we gebruiken.

Het volgen van deze patronen is geen garantie dat we een succesvolle software hebben, maar het helpt ons wel.

Ter referentie, ik zal laten zien hoe deze tafels eruit zouden zien als een "eerste snede" uit onze winkel, als illustratie van een ander patroon; dit is niet "de juiste manier", het is gewoon "een manier" die we als team hebben gekozen.

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;


  1. MySQL-vraag - Unieke sleutel Werkt niet correct of begrijp ik het verkeerd?

  2. Hoe te controleren of INSERT goed ging in de opgeslagen functie?

  3. Transponeer rijen naar kopteksten in MYSQL

  4. MYSQL-query werkt erg traag