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;