Tabel "pesta" tidak terlihat benar. Bandingkan dengan kode sumber dari pertanyaan SO lainnya ini .
Dalam struktur semacam ini, nomor id partai memang menyebar ke bawah, sehingga untuk berbicara. Biasanya harus berupa kunci utama atau kunci asing dalam tabel yang menyimpan data tentang seseorang.
Di "pelaporan" tabel Anda, sepertinya kunci utama tidak boleh 'partyid'. Itu akan memungkinkan hanya satu baris per karyawan, yang menurut saya tidak Anda maksudkan. (Saya bisa saja salah.) Jika saya benar tentang itu, Anda dapat mempertimbangkan NOT NULL UNIQUE
batasan pada {partyid, date}, dan PRIMARY KEY
kendala pada kolom baru, 'laporan'. Tabel "perjalanan" dan "kinerja" mungkin akan merujuk 'laporan'. (Tapi teruslah membaca.)
Ada tempat dalam diagram Anda di mana entitas mendapatkan kunci tambahan:perusahaan Anda memberikan nomor id karyawan yang unik kepada karyawannya, misalnya. Tidak ada alasan teoretis Anda tidak dapat menggunakan 'employid' alih-alih 'partyid' sejak saat itu untuk merujuk karyawan. Tapi ada ada alasan praktis Anda mungkin tidak ingin melakukan itu. Ini meningkatkan jumlah bergabung.
Misalnya, jika tabel "kredensial", "alat", "sertifikasi", "akademik", dan "kepatuhan" merujuk employee.employid alih-alih employee.partyid, Anda tidak bisa hanya menggabungkan "compliance" dan "party" ke mendapatkan nama orang tersebut. Anda juga harus bergabung dengan "karyawan".
Mereka harus memiliki kunci utama; kunci utama tidak harus berupa nomor id. Jika ada kunci alami yang ada, Anda harus mengidentifikasinya dan tetap mendeklarasikannya UNIK.
Tabel "pesanan" mungkin hanya memiliki "orderid" sebagai kunci utamanya; menggunakan referensi kunci asing untuk mengidentifikasi pelanggan. Dalam beberapa kasus, masuk akal untuk mengganti nama kolom. Dalam kasus pelanggan, mungkin masuk akal untuk memanggil kuncinya 'customerid' daripada 'parytid'. Saya akan membuat domain sendiri.
create domain PARTY_ID as integer not null;
Kemudian, di mana pun yang membutuhkan nomor id pesta, saya akan menggunakan domain sebagai gantinya.
create table customers (
customerid PARTY_ID primary key references parties (partyid),
...
Saya lebih suka melihat tabel manajer juga. Referensi untuk itu akan menjamin bahwa manager.managerid akan memutuskan untuk manajer yang sebenarnya, bukan hanya untuk karyawan mana pun.