sql >> Database teknologi >  >> RDS >> Mysql

DB Design Spørgsmål om Nullable Foreign Keys og Normalisering

Nogle meget gode designere bruger NULL'er i fremmednøgler uden negative konsekvenser. Jeg hælder selv på den måde. En nullbar FK repræsenterer et valgfrit forhold. I tilfælde, hvor entiteten ikke har nogen relation, indeholder FK en NULL. Pladsen over hovedet er minimal. Når joins (equijoins, mere præcist) udføres på tværs af de to tabeller, vil instanser, der indeholder NULL i FK'en, falde ud af joinningen, og det er passende.

Når det er sagt, vil jeg anbefale dig en fjerde metode. Dette involverer i alt 4 tabeller, konti, widgets, typer og tilpassede_typer. Custom_types-tabellen bruger en teknik kaldet Shared-primary-key, som er skitseret nedenfor.

CREATE TABLE accounts (
    account_id  INT UNSIGNED AUTO_INCREMENT NOT NULL, 
    # Other Columns...,
    PRIMARY KEY (account_id)
    );  
CREATE TABLE widgets (
    widget_id   INT UNSIGNED AUTO_INCREMENT NOT NULL,
    account_id  INT UNSIGNED NOT NULL, 
    type_id     INT UNSIGNED NOT NULL,
    PRIMARY KEY (widget_id),
    FOREIGN KEY (account_id) REFERENCES accounts(account_id) ON DELETE CASCADE,
    FOREIGN KEY (type_id) REFERENCES types(type_id)
    );  
CREATE TABLE types (
    type_id     INT UNSIGNED AUTO_INCREMENT NOT NULL,
    account_id  INT UNSIGNED NOT NULL, 
    name        VARCHAR(100) NOT NULL,
    PRIMARY KEY (type_id),
    FOREIGN KEY (account_id) REFERENCES accounts(account_id)
CREATE TABLE custom_types (
    type_id     INT NOT NULL,
    account_id  INT UNSIGNED NOT NULL, 
    PRIMARY KEY (type_id),
    FOREIGN KEY (type_id) REFERENCES types(type_id),
    FOREIGN KEY (account_id) REFERENCES accounts(account_id)

);

Type_id-kolonnen i custom_types er en delt primær nøgle. Bemærk, at den er erklæret BÅDE som en primær nøgle og som en fremmednøgle, og at den ikke bruger autonummerering. Det er en kopi af den primære nøgle i typer for den tilsvarende indgang. Tabellen tilpassede typer indeholder alle de data, der er til stede i brugerdefinerede typer, men fraværende i forudindstillede typer.

For forudindstillede typer foretages en indtastning i typer, men der foretages ingen indtastning i brugerdefinerede_typer. For brugerdefinerede_typer foretages først en indtastning i typer, og derefter kopieres den resulterende værdi af type_id over i brugerdefinerede_typer sammen med konto_id.

Hvis du INNER JOIN-typer og brugerdefinerede_typer, falder de forudindstillede typer ud af joinforbindelsen. Hvis du vil have både brugerdefinerede og forudindstillede typer i en enkelt join, skal du bruge en LEFT JOIN eller en RIGHT JOIN for at få den effekt. Bemærk, at resultatet af en LEFT eller RIGHT JOIN vil indeholde nogle NULL'er, selvom disse NULL'er ikke er gemt i databasen.

Ved at klikke på denne vil give dig en mere detaljeret beskrivelse af den delte primære nøgleteknik.



  1. Primefaces 5.0 diagrammer - hvordan man opretter diagrammodeller og serier dynamisk udelukkende ud fra databaseværdier

  2. Brug af en betinget UPDATE-sætning i SQL

  3. MySQL søg nøjagtigt ord med $ i word

  4. En datamodel til en vejrapp