Jika A
teman B
, maka haruskah saya menyimpan nilai AB
dan BA
, atau satu sudah cukup? Apa kelebihan dan kekurangan kedua metode tersebut.
Inilah pengamatan saya:
- Jika saya menyimpan keduanya maka saya harus memperbarui keduanya ketika menerima permintaan dari seorang teman.
- Jika saya tidak menyimpan keduanya, maka saya merasa kesulitan ketika harus melakukan beberapa
JOIN
dengan tabel ini.
Saat ini, saya menjaga hubungan tetap satu arah.
Jadi apa yang harus saya lakukan dalam kasus ini? Ada saran?
mysql
relational-theory
Chan
sumber
sumber
mysql
yang disimpan di cloud Amazon.Jawaban:
Saya akan menyimpan AB dan BA. Persahabatan sebenarnya adalah hubungan dua arah, setiap entitas terhubung dengan yang lain. Meskipun secara intuitif kita menganggap "persahabatan" sebagai satu tautan antara dua orang, dari sudut pandang relasional lebih seperti "A memiliki teman B" dan "B memiliki teman A". Dua hubungan, dua catatan.
sumber
Jika persahabatan dimaksudkan untuk menjadi simetris (yaitu tidak mungkin untuk
A
berteman denganB
tetapi tidak sebaliknya) maka saya hanya akan menyimpan hubungan satu arah dengan batasan cek memastikan bahwa setiap hubungan hanya dapat diwakili satu arah.Juga saya akan membuang id pengganti dan memiliki PK komposit sebagai gantinya (dan mungkin indeks unik komposit juga pada kolom terbalik).
Anda tidak mengatakan pertanyaan yang menyulitkan ini tetapi Anda selalu dapat membuat Tampilan
sumber
UNIQUE
, agar tidak menempatkan beban tambahan yang tidak perlu dan berlebihanINSERT
? Karena kita memilikiPRIMARY KEY (a,b)
dan karena PK adalahUNIQUE
, yang terbalikKEY (b,a)
jugaUNIQUE
tidak peduli apa.Dengan asumsi "persahabatan" selalu dua arah / saling, saya mungkin akan menanganinya seperti ini.
Hasilnya adalah Anda mengubahnya dari banyak-ke-banyak bergabung dari "orang" menjadi "orang", menjadi banyak-ke-banyak bergabung dari "orang" menjadi "persahabatan". Ini akan menyederhanakan gabungan dan kendala, tetapi memiliki efek samping yang memungkinkan lebih dari dua orang dalam "persahabatan" tunggal (meskipun mungkin fleksibilitas tambahan akan menjadi keuntungan potensial).
sumber
Anda mungkin perlu menentukan indeks di sekitar pertemanan alih-alih menggandakan jumlah baris:
Dengan cara ini, Anda menggandakan penyimpanan untuk indeks tetapi tidak untuk data tabel. Akibatnya, ini harus menjadi penghematan 25% pada ruang disk. MySQL Query Optimizer akan memilih melakukan pemindaian rentang indeks saja, itulah sebabnya mengapa konsep yang mencakup indeks berfungsi dengan baik di sini.
Berikut ini beberapa tautan bagus di Covering Indexes:
CAVEAT
Jika persahabatan tidak saling menguntungkan, Anda memiliki dasar untuk jenis hubungan lain: FOLLOWER
Jika friend_to bukan teman friend_of, Anda bisa mengabaikan hubungan itu.
Jika Anda ingin mendefinisikan hubungan untuk semua jenis, apakah itu saling atau tidak, Anda mungkin bisa menggunakan tata letak tabel berikut:
Dari tabel relasi, Anda dapat mengatur hubungan untuk menyertakan yang berikut:
Ini harus lebih kuat untuk semua hubungan, apakah hubungan itu timbal balik atau tidak.
sumber
Jika Anda dapat mengontrol dalam aplikasi bahwa id A selalu lebih rendah dari id B (pre order A, elemen B id) Anda dapat memanfaatkan bertanya tanpa OR (pilih di mana id_A = a DAN id_B = b, alih-alih bertanya (id_A = a AND id_B = b) ATAU (id_A = b AND id_B = a)), dan juga memelihara setengah dari catatan yang Anda perlukan dengan perkiraan pihak lain. Maka Anda harus menggunakan bidang lain untuk mempertahankan status hubungan (adalah-teman, a-solicited-to-b, b-solicited-to-a, exfriends-a, exfriends-b), dan Anda selesai.
Ini adalah cara saya mengelola sistem pertemanan saya, dan ini menyederhanakan sistem dan menggunakan setengah baris yang Anda perlukan dengan sistem lain, hanya mengatakan A sama dengan nilai id yang lebih rendah dalam kode.
sumber