Saya memiliki dua tabel di MySQL. Orang Tabel memiliki kolom berikut:
id | name | fruits
The fruits
kolom dapat memegang null atau array dari string seperti ( 'apel', 'orange', 'pisang'), atau ( 'strawberry'), dll Tabel kedua adalah Tabel Buah dan memiliki tiga kolom berikut:
____________________________
fruit_name | color | price
____________________________
apple | red | 2
____________________________
orange | orange | 3
____________________________
...,...
Jadi bagaimana cara mendesain fruits
kolom di tabel pertama sehingga dapat menampung larik string yang mengambil nilai dari fruit_name
kolom di tabel kedua? Karena tidak ada tipe data array di MySQL, bagaimana saya harus melakukannya?
mysql
database-schema
tonga
sumber
sumber
Jawaban:
Cara yang tepat untuk melakukannya adalah dengan menggunakan beberapa tabel dan tabel tersebut
JOIN
dalam kueri Anda.Sebagai contoh:
The
person_fruit
tabel berisi satu baris untuk setiap buah seseorang terkait dengan dan efektif menghubungkanperson
danfruits
tabel bersama-sama, IESaat Anda ingin mendapatkan kembali seseorang dan semua buahnya, Anda dapat melakukan sesuatu seperti ini:
sumber
person_id
tetapi berbedafruit_name
. Ini secara efektif merupakan implementasi teori dari jawaban Janus.person
tabel, informasi apa pun tentang buah difruits
tabel, dan informasi apa pun secara khusus tentang hubungan antara orang tertentu dan buah tertentu diperson_fruit
tabel. Karena dalam contoh ini tidak ada informasi tambahan,person_fruit
tabel hanya terdiri dari dua kolom, kunci utama dariperson
danfruits
tabel. Jumlah buah tertentu adalah contoh dari sesuatu yang lain yang bisa masuk dalamperson_fruit
tabel.INT
untuk kuncifruits
dan hanya menyimpannyaINT
di dalamperson_fruit
? Jadi, nama dapat diubah nanti dan juga membutuhkan lebih sedikit ruang jika Anda tidak memiliki lebih banyak barisfruits
daripada diperson_fruit
.Alasan tidak adanya array dalam SQL, adalah karena kebanyakan orang tidak terlalu membutuhkannya. Database relasional (SQL persis seperti itu) bekerja menggunakan relasi, dan sebagian besar waktu, yang terbaik adalah jika Anda menetapkan satu baris tabel untuk setiap "bit informasi". Misalnya, di mana Anda mungkin berpikir "Saya ingin daftar barang di sini", alih-alih buat tabel baru, tautkan baris dalam satu tabel dengan baris di tabel lain. [1] Dengan begitu, Anda dapat merepresentasikan hubungan M: N. Keuntungan lainnya adalah tautan tersebut tidak akan mengacaukan baris yang berisi item yang ditautkan. Dan database dapat mengindeks baris tersebut. Array biasanya tidak diindeks.
Jika Anda tidak memerlukan database relasional, Anda dapat menggunakan misalnya penyimpanan nilai kunci.
Baca tentang normalisasi databaseSilakan . Aturan emasnya adalah "[Setiap] non-kunci [atribut] harus memberikan fakta tentang kunci, seluruh kunci, dan tidak lain adalah kunci.". Sebuah array melakukan terlalu banyak hal. Ia memiliki banyak fakta dan menyimpan urutan (yang tidak terkait dengan relasinya itu sendiri). Dan kinerjanya buruk (lihat di atas).
Bayangkan Anda memiliki tabel orang dan Anda memiliki meja dengan panggilan telepon oleh orang-orang. Sekarang Anda dapat membuat setiap baris orang memiliki daftar panggilan teleponnya. Tetapi setiap orang memiliki banyak hubungan lain dengan banyak hal lainnya. Apakah itu berarti tabel person saya harus berisi larik untuk setiap hal yang terhubung dengannya? Tidak, itu bukanlah atribut dari orang itu sendiri.
[1]: Tidak masalah jika tabel tautan hanya memiliki dua kolom (kunci utama dari setiap tabel)! Jika hubungan itu sendiri memiliki atribut tambahan, mereka harus direpresentasikan dalam tabel ini sebagai kolom.
sumber
MySQL 5.7 sekarang menyediakan tipe data JSON . Jenis data baru ini menyediakan cara baru yang nyaman untuk menyimpan data kompleks: daftar, kamus, dll.
Yang mengatakan, sinar tidak memetakan database dengan baik, itulah sebabnya peta relasional objek bisa sangat kompleks. Secara historis orang telah menyimpan daftar / array di MySQL dengan membuat tabel yang mendeskripsikannya dan menambahkan setiap nilai sebagai recordnya sendiri. Tabel mungkin hanya memiliki 2 atau 3 kolom, atau mungkin berisi lebih banyak lagi. Bagaimana Anda menyimpan jenis data ini sangat bergantung pada karakteristik datanya.
Misalnya, apakah daftar berisi sejumlah entri statis atau dinamis? Akankah daftarnya tetap kecil, atau diharapkan bertambah menjadi jutaan catatan? Apakah akan ada banyak bacaan di tabel ini? Banyak menulis? Banyak pembaruan? Ini semua adalah faktor yang perlu dipertimbangkan saat memutuskan bagaimana menyimpan kumpulan data.
Juga, Kunci: Penyimpanan data nilai / Penyimpanan dokumen seperti Cassandra, MongoDB, Redis dll juga memberikan solusi yang baik. Berhati-hatilah di mana sebenarnya data disimpan (jika disimpan di disk atau di memori). Tidak semua data Anda harus berada dalam database yang sama. Beberapa data tidak dipetakan dengan baik ke database relasional dan Anda mungkin memiliki alasan untuk menyimpannya di tempat lain, atau Anda mungkin ingin menggunakan kunci dalam memori: database nilai sebagai cache panas untuk data yang disimpan di disk di suatu tempat atau sebagai penyimpanan sementara untuk hal-hal seperti sesi.
sumber
Catatan samping untuk dipertimbangkan, Anda dapat menyimpan array di Postgres.
sumber
Di MySQL, gunakan tipe JSON.
Dibandingkan dengan jawaban di atas, standar SQL telah memasukkan tipe array selama hampir dua puluh tahun; berguna, meskipun MySQL belum menerapkannya.
Namun, dalam contoh Anda, Anda mungkin ingin membuat tiga tabel: orang dan buah, lalu person_fruit untuk bergabung dengan mereka.
Jika Anda ingin mengaitkan orang tersebut dengan sederetan buah-buahan, Anda dapat melakukannya dengan sebuah tampilan:
Tampilan tersebut menunjukkan data berikut:
Di 5.7.22, Anda akan ingin menggunakan JSON_ARRAYAGG , daripada meretas array bersama-sama dari sebuah string.
sumber
Gunakan tipe kolom database BLOB untuk menyimpan array.
Ref: http://us.php.net/manual/en/function.serialize.php
sumber
Anda dapat menyimpan array Anda menggunakan group_Concat seperti itu
DI SINI contoh biola
sumber