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

Cara mengambil nilai dari struktur MySQL 5.7 yang dinormalisasi yang cocok dengan kriteria tertentu

Anda telah menggunakan tabel Entity-Attribute-Value untuk mencatat atribut Anda.

Ini adalah berlawanan normalisasi.

Sebutkan aturan normalisasi yang memandu Anda untuk memasukkan atribut yang berbeda ke dalam kolom yang sama. Tidak bisa, karena ini bukan praktik normalisasi.

Untuk menyelesaikan kueri Anda dengan desain EAV Anda saat ini, Anda perlu memutar hasil sehingga Anda mendapatkan sesuatu seolah-olah Anda memiliki tabel asli Anda.

SELECT * FROM (
    SELECT 
         a.article_id,
         a.title, 
         MAX(CASE attr_group WHEN 'ref_id' THEN attribute END) AS ref_id,
         MAX(CASE attr_group WHEN 'dial_c_id' THEN attribute END) AS dial_c_id
         -- ...others...
    FROM test.articles_test a
    INNER JOIN attributes attr ON a.article_id = attr.article_id
    GROUP BY a.article_id, a.title) AS pivot
WHERE pivot.ref_id = '127712' 
  AND pivot.dial_c_id = 51 

Sementara kueri di atas dapat menghasilkan hasil yang Anda inginkan, kinerjanya akan buruk. Itu harus membuat tabel temp untuk subquery, yang berisi semua data dari kedua tabel , lalu terapkan klausa WHERE pada tabel sementara.

Anda benar-benar lebih baik dengan setiap atribut di kolomnya sendiri di tabel asli Anda.

Saya mengerti bahwa Anda mencoba mengizinkan banyak atribut di masa mendatang. Ini adalah masalah umum.

Lihat jawaban saya untukCara mendesain tabel produk untuk berbagai jenis produk di mana setiap produk memiliki banyak parameter

Tetapi Anda tidak boleh menyebutnya "dinormalisasi", karena memang tidak demikian. Itu bahkan tidak didenormalisasi . Ini derelasi .

Anda tidak bisa hanya menggunakan kata-kata untuk menggambarkan apa pun yang Anda inginkan — terutama bukan kebalikan dari arti kata tersebut. Saya tidak bisa membiarkan udara keluar dari ban sepeda saya dan berkata, "Saya akan memompanya."

Anda berkomentar bahwa Anda mencoba untuk membuat database Anda "scalable." Anda juga salah paham apa arti kata "scalable". Dengan menggunakan EAV, Anda membuat struktur di mana kueri yang dibutuhkan sulit untuk ditulis dan tidak efisien untuk dieksekusi, dan data membutuhkan ruang 10x. Ini kebalikan dari terukur.

Maksud Anda adalah Anda mencoba membuat sistem yang dapat dikembangkan . Ini rumit untuk diterapkan dalam SQL, tetapi saya menjelaskan beberapa solusi dalam jawaban Stack Overflow lain yang saya tautkan. Anda mungkin juga menyukai presentasi saya Pemodelan Data yang Dapat Diperluas dengan MySQL .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bisakah saya dengan aman mengandalkan kasus nama kolom di mysql?

  2. Tidak dapat melihat mySQL COUNT dari tabel ke-3

  3. 2 catatan teratas MySQL per grup

  4. PHP Daftar Pengguna dari Database SQL di Tabel

  5. Menggunakan Amazon RDS dengan aplikasi android