Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Mehrere sich gegenseitig ausschließende Fremdschlüssel – ist das der richtige Weg?

Wenn wir uns das Modell hier ansehen, sehen wir Folgendes:

  1. Ein Benutzer ist mit genau einer Website verbunden
    • Ein Unternehmen ist mit genau einer Website verbunden
    • Eine Website ist genau einem Nutzer oder Unternehmen zugeordnet

Die dritte Beziehung impliziert die Existenz einer "Benutzer- oder Firmen"-Entität, deren PRIMARY KEY sollte irgendwo gespeichert werden.

Um ihn zu speichern, müssen Sie eine Tabelle erstellen, die einen PRIMARY KEY speichern würde eines website owner juristische Person. Diese Tabelle kann auch gemeinsame Attribute für einen Benutzer und eine Website speichern.

Da es sich um eine Eins-zu-Eins-Beziehung handelt, können auch Website-Attribute in dieser Tabelle gespeichert werden.

Die Attribute, die nicht von Benutzern und Unternehmen geteilt werden, sollten in der separaten Tabelle gespeichert werden.

Um die richtigen Beziehungen zu erzwingen, müssen Sie den PRIMARY KEY erstellen der website Verbund mit owner type als Teil davon, und erzwingen Sie den korrekten Typ in den untergeordneten Tabellen mit einem CHECK Einschränkung:

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
)