PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Apakah ada opsi untuk bergabung ke tabel untuk asosiasi banyak-ke-banyak?

  • Jika model tidak berbagi kelompok warna maka desainnya akan menjadi satu tabel:

    model [model] comes in color [color]
    
  • Jika model berbagi grup warna, buatlah dua tabel:

    model [model] comes in the colors of group [group]
    group [group] has color [color]
    

    Tabel ini bergabung dengan proyeksi ke tabel pertama:

    SELECT model, color FROM model_group NATURAL JOIN group_color
    
  • Jika model dapat memiliki warna luar biasa yang tersedia dan/atau tidak tersedia selain atau sebagai ganti grup, maka miliki tabel pengecualian. Grup tabel sekarang menjadi default warna (jika ada):

    model [model] has default color group [group]
    group [group] has color [color]
    model [model] is exceptionally available in color [color]
    model [model] is exceptionally unavailable in color [color]
    

    Tabel pengecualian kemudian masing-masing UNION dengan dan MINUSEd/EXCEPTed dari JOIN-plus-PROJECT/SELECT untuk memberikan tabel pertama:

    SELECT group, color FROM model_default NATURAL JOIN group_colour
    EXCEPT SELECT * FROM model_unavailable
    UNION SELECT * FROM model_available
    

"Redundansi" bukan tentang nilai yang muncul di banyak tempat. Ini tentang beberapa baris yang menyatakan hal yang sama tentang aplikasi.

Setiap tabel (dan ekspresi kueri) memiliki templat pernyataan kosong fill-in-the-(named-) terkait (alias predikat). Baris yang membuat pernyataan benar masuk ke dalam tabel. Jika Anda memiliki dua predikat independen maka Anda memerlukan dua tabel. Nilai yang relevan masuk dalam baris masing-masing.

Baris ulang membuat pernyataan tentang aplikasi lihat ini. (Dan cari jawaban saya yang lain tentang "pernyataan" atau "kriteria".) Normalisasi membantu karena itu menggantikan tabel yang barisnya menyatakan hal-hal dalam bentuk "... DAN ..." dengan tabel lain yang menyatakan "... " terpisah. Lihat ini dan ini.

Jika Anda berbagi grup dan hanya menggunakan satu tabel dua kolom untuk model dan warna, maka predikatnya adalah:

FOR SOME group
    model [model] comes in the colors of group [group]
AND group [group] has color [color]

Jadi poin kedua menghilangkan satu "DAN" dari predikat ini, yaitu sumber dari "ketergantungan multinilai". Jika tidak, jika Anda mengubah grup model atau warna grup, maka Anda harus secara bersamaan mengubah beberapa baris. (Intinya adalah untuk mengurangi kesalahan dan kerumitan dari redundansi, bukan menghemat ruang.)

Jika Anda tidak ingin mengulang string untuk alasan implementasi (tergantung) (ruang yang diambil atau kecepatan operasi dengan mengorbankan lebih banyak gabungan) kemudian tambahkan tabel id dan string nama dan ganti kolom dan nilai nama lama Anda dengan kolom dan nilai id. (Itu bukan normalisasi, itu memperumit skema Anda demi pengorbanan pengoptimalan data yang bergantung pada implementasi. Dan Anda harus menunjukkan ini diperlukan dan berhasil.)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara mengubah jenis kolom di Heroku?

  2. postgreSQL - dalam vs apa pun

  3. Tolok ukur Meltdown PostgreSQL

  4. Fitur Tersembunyi PostgreSQL

  5. Cara Membuat Bilangan Ordinal di PostgreSQL