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

Merancang hubungan di sekitar struktur warisan

Ada pertanyaan serupa di sini menggunakan supertipe Media dan menambahkan subtipe CD, VCR, DVD, dll.

Ini dapat diskalakan karena dalam membuat, katakanlah, subtipe BluRay, Anda membuat tabel untuk memuat data spesifik BluRay dan menambahkan entri ke tabel MediaTypes. Tidak ada perubahan yang diperlukan untuk data atau kode yang ada -- kecuali, tentu saja, untuk menambahkan kode yang akan bekerja dengan data BluRay.

Dalam kasus Anda, Pengguna akan menjadi tabel supertipe dengan Guru dan Siswa sebagai tabel subtipe.

create table Users(
    ID      int not null auto_generating,
    Type    char( 1 ) check( Type in( 'T', 'S' )),
    -- other data common to all users,
    constraint PK_Users primary key( ID ),
    constraint UQ_UserType unique( ID, Type ),
    constraint FK_UserTypes foreign key( Type )
        references UserTypes( ID )
);
create table Teachers(
    TeacherID int not null,
    TeacherType char( 1 ) check( TeacherType = 'T' )),
    -- other data common to all teachers...,
    constraint PK_Teachers primary key( TeacherID ),
    constraint FK_TeacherUser foreign key( TeacherID, TeacherType )
        references Users( ID, Types )
);

Susunan tabel Siswa akan mirip dengan tabel Guru.

Karena guru dan siswa dapat mempekerjakan guru dan siswa lain, tabel yang berisi hubungan ini akan merujuk ke tabel Pengguna.

create table Employment(
    EmployerID    int not null,
    EmployeeID    int not null,
    -- other data concerning the employment...,
    constraint CK_EmploymentDupes check( EmployerID <> EmployeeID ),
    constraint PK_Employment primary key( EmployerID, EmployeeID ),
    constraint FK_EmploymentEmployer foreign key( EmployerID )
        references Users( ID ),
    constraint FK_EmploymentEmployee foreign key( EmployeeID )
        references Users( ID )
);

Seperti yang saya pahami, Notifikasi dikelompokkan berdasarkan perusahaan:

create table Notifications(
    EmployerID    int not null
    NotificationDate date,
    NotificationData varchar( 500 ),
    -- other notification data...,
    constraint FK_NotificationsEmployer foreign key( EmployerID )
        references Users( ID )
);

Pertanyaan harus cukup sederhana. Misalnya, jika pengguna ingin melihat semua notifikasi dari perusahaannya:

select  e.EmployerID, n.NotificationDate, n.NotificationData
from    Employment  e
join    Notifications n
    on  n.EmployerID = e.EmployerID
where   e.EmployeeID = :UserID;

Ini adalah sketsa awal, tentu saja. Penyempurnaan dimungkinkan. Tetapi untuk poin bernomor Anda:

  1. Tabel Ketenagakerjaan menghubungkan pemberi kerja dengan karyawan. Satu-satunya pemeriksaan apakah untuk membuat majikan pengguna tidak dapat mempekerjakan diri mereka sendiri, tetapi jika tidak, setiap pengguna dapat menjadi karyawan dan majikan.
  2. Tabel Pengguna memaksa setiap pengguna untuk menjadi guru ('T') atau siswa ('S'). Hanya pengguna yang didefinisikan sebagai 'T' yang dapat ditempatkan di tabel Guru dan hanya pengguna yang didefinisikan sebagai 'S' yang dapat ditempatkan di tabel Siswa.
  3. Tabel Pekerjaan hanya bergabung dengan tabel Pengguna, bukan ke tabel Guru dan Siswa. Tetapi ini karena baik guru maupun siswa dapat menjadi pemberi kerja dan karyawan, bukan karena alasan kinerja apa pun. Secara umum, jangan khawatir tentang kinerja selama desain awal. Perhatian utama Anda saat ini adalah integritas data. Basis data relasional sangat bagus dengan gabungan. Jika masalah kinerja harus muncul, lalu perbaiki. Jangan menyusun ulang data Anda untuk memecahkan masalah yang belum ada dan mungkin tidak akan pernah ada.
  4. Cobalah ini dan lihat cara kerjanya.



  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 saya bisa mendapatkan id yang bertambah secara otomatis ketika saya memasukkan catatan ke dalam tabel melalui jdbctemplate

  2. Tampilkan hasil kueri SQL di php

  3. MySQL Group Dengan dengan nomor N teratas dari masing-masing jenis

  4. Bagaimana cara MYSQL Self-Join Bekerja?

  5. Menginstal mysql di macan tutul:Tidak dapat terhubung ke server MySQL lokal melalui soket