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

Chiavi esterne multiple ma mutuamente esclusive:è questa la strada da percorrere?

Se esaminiamo il modello qui, vedremo quanto segue:

  1. Un utente è correlato esattamente a un sito Web
    • Un'azienda è collegata esattamente a un sito web
    • Un sito web è correlato esattamente a un utente o azienda

La terza relazione implica l'esistenza di un'entità "utente o azienda" la cui PRIMARY KEY dovrebbe essere conservato da qualche parte.

Per memorizzarlo è necessario creare una tabella che memorizzi una PRIMARY KEY di un website owner entità. Questa tabella può anche memorizzare attributi comuni per un utente e un sito web.

Poiché si tratta di una relazione uno-a-uno, anche gli attributi del sito Web possono essere archiviati in questa tabella.

Gli attributi non condivisi da utenti e aziende devono essere archiviati in una tabella separata.

Per forzare le relazioni corrette, è necessario creare la PRIMARY KEY del website composto con owner type come parte di esso e forzare il tipo corretto nelle tabelle figlio con un CHECK vincolo:

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
)