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

SQL Banyak-ke-Banyak Hubungan Antara Beberapa Tabel

Ya, semua yang ada di sana terlihat baik-baik saja. Tapi...

Beberapa catatan:

Kami akan menggunakan tipe data yang lebih pendek untuk gender kolom; Saya tidak melihat bahwa kita membutuhkan 255 karakter untuk mengekspresikannya. (Ada batas ukuran maksimum baris yang diberlakukan.) Jika hanya ada beberapa nilai untuk itu, kami akan mempertimbangkan ENUM tipe data.

Kami juga kemungkinan akan menambahkan NOT NULL batasan pada beberapa kolom tersebut, seperti nama pahlawan, nama depan, nama belakang. Kami juga kemungkinan akan menambahkan DEFAULT '' . Terkadang, kami benar-benar perlu mengizinkan nilai NULL untuk beberapa alasan, tetapi kami menggunakan NOT NULL dimanapun kita bisa.

Saya ragu dengan TEXT kolom. Tidak ada salahnya menggunakan TEXT tipe data, tapi saya hanya curiga bahwa itu mungkin "menyembunyikan" beberapa informasi yang mungkin lebih baik disimpan di kolom tambahan.

Untuk kunci asing, kami akan menetapkan nama untuk kendala, mengikuti pola yang kami gunakan, dan juga mungkin menambahkan ON UPDATE CASCADE ON DELETE CASCADE

CONSTRAINT FK_superheroPower_power FOREIGN KEY (powerID) 
  REFERENCES power(id) ON UPDATE CASCADE ON DELETE CASCADE

Catatan tentang pengidentifikasi (nama tabel dan nama kolom)

Cara kami melakukannya, semua nama tabel huruf kecil . (Kami memiliki kumpulan opsi MySQL yang memaksa semua nama tabel menjadi huruf kecil.) Kami melakukan ini untuk menghindari masalah ketidakcocokan untuk sistem operasi/sistem file yang berbeda (beberapa di antaranya peka terhadap huruf besar-kecil, dan beberapa tidak).

Juga, nama tabel adalah tunggal . Nama tabel menamai apa satu baris dari tabel mewakili. Kami juga tidak menyertakan _table sebagai bagian dari nama.

Nama kolom di MySQL tidak pernah peka huruf besar/kecil, tetapi kami juga selalu menggunakan huruf kecil untuk nama kolom. Kami tidak "camelCase" nama kolom kami, kami menggunakan karakter garis bawah sebagai pemisah, mis. power_id vs. powerID , hero_name vs. heroName .

TINDAK LANJUT

"Catatan" saya di atas bukanlah aturan khusus yang harus diikuti; itu hanya pola yang kami gunakan.

Mengikuti pola ini tidak menjamin bahwa kami akan memiliki perangkat lunak yang sukses, tetapi itu membantu kami.

Untuk referensi Anda, saya akan menunjukkan bagaimana tabel ini akan terlihat sebagai "potongan pertama" dari toko kami, sebagai ilustrasi pola lain; ini bukan "jalan yang benar", itu hanya "cara" yang telah kami tetapkan sebagai sebuah tim.

CREATE TABLE superhero
( id               INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'pk'
, hero_name        VARCHAR(255) NOT NULL                COMMENT ''
, first_name       VARCHAR(255) NOT NULL DEFAULT ''     COMMENT ''
, last_name        VARCHAR(255) NOT NULL DEFAULT ''     COMMENT ''
, first_appearance DATE                                 COMMENT 'date superhero first appeared'
, gender           ENUM('female','male','other')        COMMENT 'female,male or other'
, biography_text   TEXT                                 COMMENT ''
, universe         VARCHAR(255)                         COMMENT ''
, PRIMARY KEY(id)
, UNIQUE KEY superhero_UX1 (hero_name) 
) ENGINE=InnoDB;

CREATE TABLE power
( id               INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'pk'
, name             VARCHAR(255) NOT NULL                COMMENT ''  
, description_text TEXT NOT NULL                        COMMENT '' 
, PRIMARY KEY(id)
, UNIQUE KEY power_UX1 (name)
) ENGINE=InnoDB;

CREATE TABLE superheropower
( superhero_id   INT UNSIGNED NOT NULL         COMMENT 'pk, fk ref superhero'
, power_id       INT UNSIGNED NOT NULL         COMMENT 'pk, fk ref power'
, PRIMARY KEY(superhero_id, power_id)
, CONSTRAINT FK_superheropower_superhero 
     FOREIGN KEY(superhero_id) REFERENCES superhero(id)
     ON UPDATE CASCADE ON DELETE CASCADE
, CONSTRAINT FK_superheropower_power
     FOREIGN KEY (power_id) REFERENCES power(id) 
     ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MYSQL ORDER BY CASE Masalah

  2. Microsoft SQL Server setara dengan MySQL REGEXP

  3. Kendala terminologi MySQL vs perbedaan kunci asing?

  4. Bagaimana cara mengaktifkan eksplisit_defaults_for_timestamp?

  5. Bagaimana cara mengubah data vertikal menjadi data horizontal dengan SQL?