Apakah masuk akal TIDAK untuk menyingkat hubungan satu ke satu?

12

Jika kita memiliki Tabel A yang memiliki hubungan satu lawan satu dengan Tabel B, apakah masuk akal untuk memisahkannya? Atau apakah tidak ada salahnya untuk menggabungkan mereka ke dalam satu meja? Apakah salah satu dari skenario ini (dua tabel vs satu tabel gabungan) berdampak apa pun terhadap bentuk normal (1NF, 2NF, 3NF, dll)?

Saltshaker ke-29
sumber
5
Apakah yang Anda maksud 1-to-1 atau 1-to-0-atau-1?
jpmc26

Jawaban:

30

Ya, ada banyak alasan mengapa ini mungkin desain yang lebih baik.

Anda mungkin memiliki hubungan warisan / ekstensi, misalnya Anda mungkin memiliki Usertabel dan kemudian Administratortabel yang memiliki lebih banyak bidang. Kedua tabel mungkin memiliki kunci utama ID Pengguna (dan karena itu memiliki hubungan 1: 1) tetapi tidak semua pengguna akan memiliki catatan dalam Administratortabel. Anda akan membutuhkan sesuatu yang serupa jika Anda mendukung alur kerja, misalnya ScheduledTasktabel dan CompletedTasktabel.

Anda mungkin ingin memiliki tabel yang ringan untuk data yang umum digunakan Userdan kemudian tabel yang lebih besar untuk detail yang tidak terlalu sering Anda butuhkan UserDetails. Ini dapat meningkatkan kinerja karena Anda dapat memasukkan lebih banyak catatan ke dalam satu halaman data.

Anda mungkin ingin izin yang berbeda ke tabel, misalnya UserdanUserCredentials

Anda mungkin menginginkan strategi cadangan yang berbeda dan oleh karena itu letakkan dua tabel di partisi yang berbeda, misalnya TransactiondanTransactionArchive

Anda mungkin memerlukan lebih banyak kolom daripada yang dapat didukung dalam satu tabel, misalnya jika ada banyak kolom teks besar yang harus Anda indeks dan platform DB Anda terbatas pada halaman data 4K atau apa pun yang Anda miliki.

John Wu
sumber
Jika tabel Anda memiliki lebih banyak kolom daripada yang dapat didukung oleh sistem database, Anda memiliki masalah desain. Tetapi sebaliknya, jawaban Anda masuk akal.
Robert Harvey
2
Setuju ... Saya mencoba daftar lengkap, tidak menyunting di setiap alasan.
John Wu
Apa latar belakang Anda dalam alur kerja? Apakah Anda memiliki perangkat lunak spesifik yang Anda gunakan? Sudahkah Anda menggulirkan sistem alur kerja Anda sendiri?
Robert Harvey
1
Fisik = berkaitan dengan kendala fisik seperti kinerja server, ukuran halaman, pengindeksan, pengelompokan, pencadangan, dll. Tidak ada yang harus memengaruhi desain logis. Dari perspektif yang sepenuhnya logis, satu entitas harus dikonseptualisasikan sebagai satu tuple atau baris dalam satu tabel.
John Wu
4
Tautan "Hubungan satu-ke-satu dalam database relasional terjadi ketika satu catatan induk atau bidang memiliki nol atau satu catatan anak saja."
John Wu
6

Menambahkan ke jawaban excelent oleh @ john-wu yang lain, alasan lain adalah ketika Anda memiliki tipe kolom A BLOB seperti gambar.

Anda ingin memiliki kolom Gumpalan di tabel terpisah, tidak hanya agar kueri di tabel pengguna lebih cepat, tetapi juga karena Anda bisa memindahkan tabel yang berisi gumpalan ke tablespace yang berbeda dengan penyimpanan yang lebih murah, lebih lambat, menjaga data yang paling kueri dalam tablespace utama pada penyimpanan yang lebih cepat.

Tulains Córdova
sumber
3

Hubungan satu ke satu hanya benar-benar masuk akal ketika Anda ingin catatan terkait di Tabel B menjadi opsional.

Terkadang yang Anda inginkan adalah rekaman varian atau Tagged Union . Itu berarti Anda memiliki beberapa tabel yang berisi informasi berbeda, tetapi semuanya terkait kembali ke Tabel A dalam hubungan satu-ke-satu. Anda kemudian memilih tabel mana yang akan dikaitkan berdasarkan bidang di Tabel A

Sebagai contoh:

type Transaction(The_Type: PaymentType := Cash) is record

    Amount: Integer;

    case The_Type is
        when Cash =>
            Discount: boolean;
        when Check =>
            CheckNumber: Positive;
        when Credit =>
            CardNumber: String(1..5);
            Expiration: String(1..5);
    end case;
end record;
Robert Harvey
sumber
Jika itu opsional, bagaimana bedanya dengan semua ini berada dalam satu tabel dan hanya memilih kolom yang Anda inginkan?
The 29th Saltshaker
Anda mengambil biaya memiliki bidang-bidang tambahan di tabel utama, bahkan jika tidak ada di dalamnya. Jika ada beberapa tabel dalam catatan varian Anda, Anda mungkin memiliki 100 kolom dalam satu tabel, yang sebagian besar tidak digunakan sebagian besar waktu.
Robert Harvey
2

Dalam pemodelan bisnis, dua entitas A dan B yang secara logis terpisah dari sudut pandang bisnis biasanya memetakan ke tabel yang berbeda.

Misalnya, ketika melakukan pemodelan bisnis dengan cara berorientasi objek, Anda biasanya memiliki semacam pemetaan objek-relasional. Anda mungkin mulai dengan model objek dan mendapatkan model relasional Anda dari itu. Jadi bayangkan dalam model objek Anda, Anda telah membuat kelas A dan B, yang, meskipun objek memiliki korespondensi 1: 1, harus tetap terpisah karena prinsip tanggung jawab tunggal . Catatan dalam model objek Anda, kelas-kelas ini bukan hanya tabel dengan atribut, mereka mungkin mewakili objek bisnis, dengan beberapa perilaku yang diterapkan dalam metode. Dan ketika Anda memetakan kelas-kelas itu sekarang langsung ke model relasional, Anda mendapatkan tabel terpisah A dan B dengan hubungan 1: 1.

Menurut pengalaman saya, ketika membuat model data bisnis atau OO, pemisahan logis ini jauh lebih khas untuk hubungan 1: 1 daripada alasan "fisik" seperti kinerja, keamanan individu, atau partisi.

Doc Brown
sumber
Bisakah Anda memberikan contoh konkret tentang apa yang Anda maksud?
The 29th Saltshaker