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

Menulis kueri warisan yang ditulis dalam SQL menggunakan gabungan dalam?

Jika Anda melihat hierarki pohon, maka model kumpulan bersarang bekerja dengan cukup baik, tetapi melibatkan perubahan besar dalam struktur tabel warisan Anda.

Jika Anda menerapkan grafik berarah arbitrer (misalnya, Anda memiliki profil "penulis" yang dapat menerbitkan artikel tetapi tidak memoderasi komentar, dan profil "moderator" yang dapat memoderasi komentar tetapi tidak menerbitkan artikel), Anda mungkin ingin melihat untuk beberapa solusi lain.

Salah satu kemungkinannya adalah menyerah pada warisan dan mengatur izin secara manual untuk setiap grup.

Kemungkinan lain adalah menggunakan tabel pewarisan untuk menyimpan baik pewarisan langsung maupun tidak langsung (yaitu, sebuah simpul akan dihubungkan dengan semua anaknya menggunakan hubungan "langsung", serta semua turunannya menggunakan hubungan "tidak langsung"). Strategi ini mengharuskan Anda untuk membuat ulang semua hubungan tidak langsung dalam tabel setiap kali Anda mengubah salah satu hubungan langsung (ini dapat dilakukan dengan menggunakan INSERT SELECT sederhana ), tetapi memiliki keuntungan hanya membutuhkan satu gabungan untuk mengakses semua turunan.

Ide dasarnya adalah:

CREATE TABLE group_inherit (
  parent INT NOT NULL, 
  child INT NOT NULL, 
  distance INT NOT NULL, 
  PRIMARY KEY (parent,child)
);

/* Clean up indirect relations */
DELETE FROM group_inherit WHERE distance <> 0;

/* Repeat this for each D > 0 until the maximum distance is reached */
INSERT IGNORE INTO (parent, child, distance) 
SELECT fst.parent, snd.child, D
FROM group_inherit fst
INNER JOIN group_inherit snd ON snd.parent = fst.child
WHERE fst.distance = 0 AND snd.distance = D - 1;

/* Select all permissions for a user type */
SELECT perm.*
FROM group_permissions perm
INNER JOIN group_inherit ON perm.moderator = child
WHERE parent = ?

Pengulangan pada jarak harus dilakukan sampai tidak ada lagi elemen jarak D-1 yang tersedia, yang dapat dilakukan dengan menggunakan kueri pemilihan atau, jika Anda memilikinya, meta-informasi tentang berapa banyak baris yang dimasukkan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pencarian pengguna di bidang basis data terenkripsi

  2. MySQL:Perbarui Kueri menggunakan If else

  3. Kesalahan Konversi Array ke String Symfony 3

  4. Bagaimana cara saya meminta bidang yang berisi teks tertentu di MySQL?

  5. Mengembalikan gumpalan dengan json