Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Pertanyaan Desain DB tentang Kunci Asing Nullable dan Normalisasi

Beberapa desainer yang sangat baik menggunakan NULL dalam kunci asing tanpa konsekuensi yang merugikan. Saya sendiri bersandar seperti itu. FK nullable mewakili hubungan opsional. Dalam kasus di mana entitas tidak memiliki hubungan, FK berisi NULL. Ruang overhead minimal. Ketika penggabungan (equijoin, lebih tepatnya) dilakukan di dua tabel, instance yang mengandung NULL di FK akan keluar dari gabungan, dan itu sesuai.

Karena itu, saya akan merekomendasikan metode keempat kepada Anda. Ini melibatkan total 4 tabel, akun, widget, tipe, dan custom_types. Tabel custom_types menggunakan teknik yang disebut Shared-primary-key, diuraikan di bawah ini.

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)

);

Kolom type_id di custom_types adalah kunci utama bersama. Perhatikan bahwa itu dinyatakan KEDUA sebagai kunci utama dan sebagai kunci asing, dan tidak menggunakan nomor otomatis. Ini adalah salinan dari kunci utama dalam tipe untuk entri yang sesuai. Tabel tipe kustom berisi semua data yang ada dalam tipe kustom tetapi tidak ada dalam tipe preset.

Untuk tipe preset, entri dibuat dalam tipe, tetapi tidak ada entri yang dibuat di custom_types. Untuk custom_types, entri pertama kali dibuat dalam jenis, dan kemudian nilai yang dihasilkan dari type_id disalin ke dalam custom_types, bersama dengan id_akun.

Jika Anda tipe INNER JOIN dan custom_types, tipe preset akan keluar dari join. Jika Anda ingin tipe kustom dan preset dalam satu gabungan, Anda harus menggunakan LEFT JOIN atau RIGHT JOIN untuk mendapatkan efek itu. Perhatikan bahwa hasil dari LEFT atau RIGHT JOIN akan berisi beberapa NULL, meskipun NULL tersebut tidak disimpan dalam database.

Mengklik ini akan memberi Anda deskripsi yang lebih rinci tentang teknik kunci utama bersama.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. nilai default GUID untuk kolom di mysql

  2. Semua nilai ='s' dalam tabel dalam kesalahan PHP

  3. Masalah penyandian unicode python

  4. MySqli:apakah mungkin membuat database?

  5. Apakah mungkin untuk membaca data MongoDB, memprosesnya dengan Hadoop, dan mengeluarkannya ke dalam RDBS (MySQL)?