sql >> Database >  >> RDS >> Mysql

Meerdere, maar elkaar uitsluitende externe sleutels - is dit de juiste keuze?

Als we hier naar het model kijken, zien we het volgende:

  1. Een gebruiker is gerelateerd aan precies één website
    • Een bedrijf is gerelateerd aan precies één website
    • Een website is gerelateerd aan precies één gebruiker of bedrijf

De derde relatie impliceert het bestaan ​​van een "gebruiker of bedrijf" entiteit waarvan de PRIMARY KEY moet ergens worden opgeslagen.

Om het op te slaan moet je een tabel maken waarin een PRIMARY KEY . wordt opgeslagen van een website owner entiteit. In deze tabel kunnen ook kenmerken worden opgeslagen die gemeenschappelijk zijn voor een gebruiker en een website.

Omdat het een één-op-één relatie is, kunnen ook websitekenmerken in deze tabel worden opgeslagen.

De kenmerken die niet door gebruikers en bedrijven worden gedeeld, moeten in de aparte tabel worden opgeslagen.

Om de juiste relaties te forceren, moet u de PRIMARY KEY . maken van de website composiet met owner type als onderdeel ervan, en forceer het juiste type in de onderliggende tabellen met een CHECK beperking:

CREATE TABLE website_owner (
    type INT NOT NULL,
    id INT NOT NULL,
    website_attributes,
    common_attributes,
    CHECK (type IN (1, 2)) -- 1 for user, 2 for company
    PRIMARY KEY (type, id)
)

CREATE TABLE user (
    type INT NOT NULL,
    id INT NOT NULL PRIMARY KEY,
    user_attributes,
    CHECK (type = 1),
    FOREIGN KEY (type, id) REFERENCES website_owner
)

CREATE TABLE company (
    type INT NOT NULL,
    id INT NOT NULL PRIMARY KEY,
    company_attributes,
    CHECK (type = 2),
    FOREIGN KEY (type, id) REFERENCES website_owner
)


  1. Hoe verwijder ik een MySQL-database?

  2. Onbewerkte SQL-querystring ophalen uit door PDO voorbereide instructies

  3. Een kolom selecteren die ook een trefwoord is in MySQL

  4. C++-programma dat communiceert met MySQL-database