Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wiele, ale wzajemnie wykluczających się kluczy obcych — czy to jest droga?

Jeśli przyjrzymy się temu modelowi, zobaczymy:

  1. Użytkownik jest powiązany z dokładnie jedną witryną
    • Firma jest powiązana z dokładnie jedną witryną
    • Witryna jest powiązana z dokładnie jednym użytkownikiem lub firmą

Trzecia relacja sugeruje istnienie encji „użytkownika lub firmy”, której PRIMARY KEY powinny być gdzieś przechowywane.

Aby go przechowywać, musisz utworzyć tabelę, która będzie przechowywać PRIMARY KEY website owner podmiot. Ta tabela może również przechowywać atrybuty wspólne dla użytkownika i witryny.

Ponieważ jest to relacja jeden do jednego, atrybuty witryny mogą być również przechowywane w tej tabeli.

Atrybuty, które nie są współdzielone przez użytkowników i firmy, powinny być przechowywane w osobnej tabeli.

Aby wymusić prawidłowe relacje, musisz utworzyć PRIMARY KEY website złożony z owner type jako jego część i wymuś poprawny typ w tabelach podrzędnych za pomocą CHECK ograniczenie:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wyświetlić sortowanie serwerów w MySQL?

  2. Zaktualizowano do Ubuntu 16.04 teraz zależności MySQL-python są zepsute

  3. Odmowa polecenia aktualizacji dla użytkownika

  4. MySQL NET Connect 6.7.2 w Visual Studio 2012

  5. Połączyć tabele w dwóch różnych bazach danych?