Misalnya, jika saya ingin menyimpan daftar teman pengguna, maka cara yang dapat saya pikirkan adalah seperti ini
pengguna. teman
Yohanes. Jim
Yohanes. Bob
Yohanes. Amy
Bob. Jim
Bob. Amy
Jadi daftar teman John termasuk Jim, Bob, dan Amy, dan daftar teman Bob termasuk Jim dan Amy. Tetapi tampaknya sangat tidak efisien untuk membuat baris baru setiap kali diperlukan entri baru dalam daftar
Saya ingin dapat menyimpan nilai-nilai seperti ini
pengguna. Daftar teman
Yohanes. Jim, Bob, Amy
Bob. Jim, Amy
Apa cara paling efisien untuk melakukan ini?
Sep 13 '08 #
9 33519
Hai
Metode kedua yang Anda sebutkan tidak boleh digunakan. Tidak boleh ada bidang yang berisi lebih dari satu bagian data
Metode sederhana untuk melakukan hal seperti itu adalah dengan membuat dua tabel. Satu untuk info pengguna dan yang kedua untuk hubungan antara setiap pengguna
Ini mungkin terlihat seperti
- Pengguna
- ----------------
- UserID Nama Pengguna
- 1 Yohanes
- 2 Jim
- 3 Ami
- ----------------
- UserRelation
- ----------------
- UserID FriendID
- 1 2
- 1 3
- 2 1
- 3 2
- ----------------
Sep 13 '08 #
HaiIni adalah pengaturan yang saya miliki saat ini, tetapi saya pikir itu tidak efisien. Jadi hanya untuk klarifikasi, ini adalah cara terbaik untuk menyimpan kumpulan data tipe daftar?Metode kedua yang Anda sebutkan tidak boleh digunakan. Tidak boleh ada bidang yang berisi lebih dari satu bagian data
Metode sederhana untuk melakukan hal seperti itu adalah dengan membuat dua tabel. Satu untuk info pengguna dan yang kedua untuk hubungan antara setiap pengguna
Ini mungkin terlihat seperti
Di mana kedua bidang talble UserRelation mereferensikan bidang UserID di tabel Pengguna. Anda bahkan dapat menggabungkannya sebagai Kunci Utama untuk menghindari entri duplikat
- Pengguna
- ----------------
- UserID Nama Pengguna
- 1 Yohanes
- 2 Jim
- 3 Ami
- ----------------
- UserRelation
- ----------------
- UserID FriendID
- 1 2
- 1 3
- 2 1
- 3 2
- ----------------
Satu hal lagi. Di tabel kedua itu, apa kunci primer uniknya?
Sep 14 '08 #
Ya. Ini cukup banyak dasar dari N. hubungan M
Ini juga jauh lebih efisien daripada yang Anda sarankan di posting pertama Anda
Pertama, contoh pertama Anda menyimpan semuanya sebagai bidang teks. Jauh lebih cepat untuk mencari melalui bilangan bulat daripada teks, bahkan jika bidang teks diindeks. Belum lagi jumlah ruang disk yang dibutuhkan semua teks, dibandingkan dengan bilangan bulat
Contoh kedua Anda, saat menggunakan struktur tabel yang tidak terlalu rumit, menyimpan beberapa bagian data di setiap bidang sebagai string, yang harus diproses dan dipecah menjadi setiap bagian individu setiap kali salah satu darinya perlu digunakan
Overhead yang jauh melebihi overhead apa pun yang akan ditimbulkan oleh GABUNG sederhana, terutama menggunakan struktur sederhana, seperti yang saya posting
Tabel kedua tidak memerlukan kunci primer bilangan bulat satu kolom tradisional yang kami gunakan di sebagian besar tabel
Anda dapat menggunakan dua kolom kunci asing sebagai kunci utama
- BUAT TABEL UserRelation (
- UserID_FK INT Unsigned Not Null References User(UserID),
- FriendID_FK Int Unsigned Not Null References User(UserID),
- Kunci Primer (UserID_FK, FriendID_FK)
- );
Sep 14 '08 #
Ya. Ini cukup banyak dasar dari N. hubungan MSaya tidak terbiasa dengan sintaks untuk membuat tabel yang mereferensikan kunci asing. Bisakah Anda menjelaskan penggunaan dua nama kolom dengan Primary Key()?Ini juga jauh lebih efisien daripada yang Anda sarankan di posting pertama Anda
Pertama, contoh pertama Anda menyimpan semuanya sebagai bidang teks. Jauh lebih cepat untuk mencari melalui bilangan bulat daripada teks, bahkan jika bidang teks diindeks. Belum lagi jumlah ruang disk yang dibutuhkan semua teks, dibandingkan dengan bilangan bulat
Contoh kedua Anda, saat menggunakan struktur tabel yang tidak terlalu rumit, menyimpan beberapa bagian data di setiap bidang sebagai string, yang harus diproses dan dipecah menjadi setiap bagian individu setiap kali salah satu darinya perlu digunakan
Overhead yang jauh melebihi overhead apa pun yang akan ditimbulkan oleh GABUNG sederhana, terutama menggunakan struktur sederhana, seperti yang saya postingTabel kedua tidak memerlukan kunci primer bilangan bulat satu kolom tradisional yang kami gunakan di sebagian besar tabel
Anda dapat menggunakan dua kolom kunci asing sebagai kunci utamaIni juga akan melindungi tabel dari entri duplikat, seperti menautkan satu pengguna dua kali ke teman yang sama
- BUAT TABEL UserRelation (
- UserID_FK INT Unsigned Not Null References User(UserID),
- FriendID_FK Int Unsigned Not Null References User(UserID),
- Kunci Primer (UserID_FK, FriendID_FK)
- );
Terima kasih untuk bantuannya
Sep 14 '08 #
Tentu
Sederhananya, jika Anda menentukan beberapa kolom dalam klausa Kunci Utama, MySQL akan membuat kunci bersama, termasuk semuanya
Nilai sebenarnya dari Kunci Utama akan menjadi seperti itu
Dimana nilai col1-colN akan diganti dengan nilai tiap kolom pada baris yang diberikan
Karena itu, Anda tidak dapat membuat baris yang berisi kombinasi nilai yang tepat untuk kolom PK seperti baris sebelumnya. Nilai Kunci Utama harus unik, bahkan setiap kolom yang membentuk Kunci Utama dapat memiliki entri duplikat
Yang menjadikan ini ideal untuk situasi persis yang sedang kita diskusikan
Sep 14 '08 #
Jadi jika tabel User dan UserRelation diimplementasikan dalam aplikasi sebenarnya, untuk menampilkan daftar teman John, Anda harus melakukan hal berikut
- PILIH UserID FROM `User` WHERE UserName = 'John'
- PILIH FriendID DARI `UserRelation` DI MANA UserID = 1
- PILIH UserName FROM `UserRelation` WHERE UserID = 2
- PILIH UserName FROM `UserRelation` WHERE UserID = 3
- Teman
- ----------------
- Nama Pengguna NamaTeman
- Yohanes Jim
- John Amy
- Jim John
- Amy John
- ----------------
11 Okt '08 #
Ya. Mencocokkan teks biasanya jauh lebih lambat daripada mencocokkan angka, meskipun pendekatan Anda sangat sederhana
Belum lagi cara yang Anda sarankan akan menghabiskan lebih banyak ruang disk daripada cara yang tepat
Anda perlu menggunakan alat yang tersedia di database relasional
Kueri SELECT tidak hanya terbatas pada sintaks SELECT FROM WHERE. Anda dapat mengambil data dari lebih dari satu tabel, dan memfilter data ini berdasarkan lebih dari pemeriksaan boolean x = y sederhana
Ini adalah bagaimana database seperti itu harus digunakan
- PILIH `Pengguna`. `UserName` SEBAGAI 'Nama Teman'
- DARI `Pengguna`
- GABUNG INNER `UserRelation`
- AKTIF `Pengguna`. `UserID` = `UserRelation`. `FriendID_FK`
- DAN `UserRelation`. `UserID_FK` = (
- PILIH `UserID` DARI `User`
- WHERE `UserName` = 'John'
- )
Perhatikan bahwa saya berasumsi bahwa UserName itu unik, itulah sebabnya saya menggunakannya di subquery tanpa klausa LIMIT
Itu melakukan persis seperti yang dilakukan semua kueri SELECT Anda, tetapi dengan cara yang benar
Ini adalah kekuatan sebenarnya dari database relasional, kemampuannya untuk menggabungkan tabel dan memfilter data berdasarkan lebih dari satu tabel tunggal pernyataan SELECT FROM WHERE
Jika Anda tidak mendapatkan sintaksnya, saya sarankan Anda membaca tentang sintaks Join dan Subquery
Jika semuanya baru bagi Anda, Anda mungkin ingin mencari beberapa tutorial tentang konsep tersebut
11 Okt '08 #
Ini semua baik dan bagus sampai teman tersebut memiliki lebih dari satu teman lol
17 Maret '11 #
Bagaimana maksudmu?
Seluruh tujuan dari konsep yang kita bicarakan di sini adalah untuk menghubungkan satu baris ke beberapa baris lainnya. (Membaca. untuk memungkinkan satu orang berteman dengan banyak orang. )