mysql - berapa banyak kolom yang terlalu banyak?

111

Saya sedang menyiapkan tabel yang mungkin memiliki lebih dari 70 kolom. Saya sekarang berpikir untuk membaginya karena beberapa data di kolom tidak akan diperlukan setiap kali tabel diakses. Kemudian lagi, jika saya melakukan ini, saya harus menggunakan gabungan.

Pada titik manakah, jika ada, kolom dianggap terlalu banyak?

Brad
sumber
6
Kami tidak harus menggunakan SELECT * setiap saat. Kami selalu memiliki opsi untuk memilih hanya kolom yang kami butuhkan untuk situasi tertentu.
APC
3
70 kolom ?! Berapa banyak dari itu yang tidak boleh nol?
OMG Ponies
1
Pertanyaan besarnya adalah ... apakah Anda menormalkan tabel Anda? 70 adalah jumlah yang tidak biasa kecuali Anda sengaja melakukan denormalisasi untuk kinerja (sangat sedikit hal yang memiliki 70 atribut unik). Jika Anda melakukan denormalisasi demi kinerja maka saya setuju dengan ChssPly76 bahwa Anda dapat menggunakan database apa pun yang memungkinkan Anda lolos.
Godeke
2
@Bayu_joo apakah itu lelucon? Saya baru mengenal MySQL dan tidak bisa mendapatkannya, apakah maksud Anda JOIN adalah hal yang baik atau sesuatu untuk dicoba dan dihindari?
Elia Iliashenko
2
Sebanyak gabungan adalah bagian inti dari SQL, bergabung demi bergabung mungkin akan menurunkan kinerja dan pemeliharaan untuk aplikasi apa pun yang Anda miliki.
jeteon

Jawaban:

142

Itu dianggap terlalu banyak setelah di atas batas maksimum yang didukung oleh database .

Fakta bahwa Anda tidak perlu setiap kolom dikembalikan oleh setiap kueri adalah hal yang normal; itulah mengapa pernyataan SELECT memungkinkan Anda secara eksplisit memberi nama kolom yang Anda butuhkan.

Sebagai aturan umum, struktur tabel Anda harus mencerminkan model domain Anda; Jika Anda benar-benar memiliki 70 (100, what have you) atribut milik entitas yang sama, tidak ada alasan untuk memisahkannya menjadi beberapa tabel.

ChssPly76
sumber
29
@KM - itulah mengapa saya mengatakan "atribut milik entitas yang sama pada model domain". Jumlah kolom yang tinggi dalam tabel TIDAK membuatnya dinormalisasi; itulah yang diwakili kolom tersebut yang penting. Selain itu, meskipun normalisasi jelas merupakan hal yang baik, ini BUKAN solusi untuk semua masalah kehidupan. Pertanyaan jebakan - apakah menurut Anda jumlah suara di sebelah pertanyaan / jawaban SO dihitung select count(*) from votessetiap kali atau menurut Anda mungkin itu didenormalisasi? Apakah itu membuat database SO buruk dan Jeff Atwood gila?
ChssPly76
@ ChssPly76, ini adalah database relasional bukan model objek. ada tabel, baris, dan kolom, bekerja dalam batasan itu jika Anda menginginkan kinerja maksimal, meniru objek Anda demi kenyamanan demi kinerja. Jadi, haruskah setiap informasi tentang seseorang disimpan dalam baris yang sama? tidak, pisahkan dan kelompokkan ke dalam tabel yang berbeda (menggunakan contoh saya dari komentar saya sebelumnya): "Person", "Activities" "HealthRecords". Menyimpan SUM untuk alasan kinerja adalah masalah yang sama sekali berbeda dari menyimpan semua data dalam 70 kolom untuk menghindari gabungan.
KM.
20
Haruskah "numberOfTeethPulled" menjadi bagian dari catatan Person? Tidak, mungkin tidak boleh disimpan sama sekali - Anda akan mendapatkan info itu dari "ToothExtractionRecord" jika model domain Anda memerlukan tingkat detail seperti itu. Tapi itu contoh ANDA (dan, berani saya katakan, agak dibuat-buat) - tidak ada hubungannya dengan maksud saya: sejumlah besar kolom dalam tabel TIDAK berarti tabel didenormalisasi. Pikirkan kontrak real estat / pesanan pembelian / dokumen keuangan lainnya hanya untuk menyebutkan beberapa contoh. Bisakah mereka dibagi lagi menjadi beberapa tabel? Iya. Ada alasan untuk melakukannya? Tidak juga.
ChssPly76
1
+1, itu lucu sekali. Jika Anda membuat tabel lain, dan itu hanya akan menjadi hubungan 1: 1 Anda mungkin harus memasukkannya ke dalam tabel utama. Ini tidak akan menghemat ruang, Ini tidak akan berkinerja jauh lebih baik jika Anda tidak meminta data vs tidak ada di tabel sama sekali. Satu-satunya alasan sah yang terlintas di benak saya saat ini, adalah jika ada informasi sensitif di sana seperti SSN, info kartu kredit, dll ...
Vandel212
1
Jika saya memiliki satu tabel memiliki 15 kolom, dan tabel lainnya memiliki 300 kolom, kunci utama dari kedua tabel tersebut adalah sama. Pilih satu kolom di dua tabel, apakah kinerjanya akan berbeda secara signifikan?
penawaran tidak dapat menolak
28

Ada beberapa manfaat untuk memisahkan tabel menjadi beberapa dengan kolom yang lebih sedikit, yang juga disebut Partisi Vertikal . Berikut ini beberapa di antaranya:

  1. Jika Anda memiliki tabel dengan banyak baris, memodifikasi indeks dapat memakan waktu lama, karena MySQL perlu membangun kembali semua indeks dalam tabel. Memiliki indeks yang terpecah menjadi beberapa tabel dapat membuatnya lebih cepat.

  2. Bergantung pada kueri dan jenis kolom Anda, MySQL dapat menulis tabel sementara (digunakan dalam kueri pemilihan yang lebih kompleks) ke disk. Ini buruk, karena disk i / o bisa menjadi leher botol besar. Ini terjadi jika Anda memiliki data biner (teks atau blob) dalam kueri.

  3. Tabel yang lebih lebar dapat menyebabkan kinerja kueri menjadi lebih lambat.

Jangan melakukan pengoptimalan sebelum waktunya, tetapi dalam beberapa kasus, Anda bisa mendapatkan peningkatan dari tabel yang lebih sempit.

jonstjohn
sumber
5
Mengapa MySQL perlu membangun kembali semua indeks dalam tabel jika hanya satu yang diubah?
Petr Peller
Saya juga bertanya-tanya hal yang sama. Mengapa MySQL membangun kembali semua indeks di tabel? Apakah pernyataan yang disebutkan di atas benar?
maj
13

Terlalu banyak jika melanggar aturan normalisasi. Sangat sulit untuk mendapatkan banyak kolom jika Anda menormalkan database Anda. Rancang database Anda untuk memodelkan masalah, bukan di sekitar aturan atau ide buatan tentang pengoptimalan untuk platform db tertentu.

Terapkan aturan berikut ke tabel lebar dan Anda kemungkinan akan memiliki kolom yang jauh lebih sedikit dalam satu tabel.

  1. Tidak ada elemen yang berulang atau kelompok elemen
  2. Tidak ada ketergantungan parsial pada kunci yang digabungkan
  3. Tidak ada ketergantungan pada atribut non-kunci

Berikut ini tautan untuk membantu Anda.

JohnFx
sumber
17
It is pretty hard to get that many columns if you are normalizing your database.Tidak sesulit kelihatannya.
Petr Peller
5
Jelas tidak terlalu sulit. Orang tampaknya tidak benar-benar memahami bentuk normal di sekitar bagian ini. Anda dapat memiliki 10.000 kolom dan MASIH dinormalisasi (bahkan ke bentuk normal tertinggi).
Hejazzman
2
@foljs Dan di situlah praktik denormalisasi yang diterima masuk. Jika Anda berada di persimpangan dan sebuah mobil hendak menabrak Anda, adalah bodoh jika menunggu lampu menjadi hijau. Anda harus menyingkir. Meskipun melewati lampu merah mungkin secara teknis tidak legal, Anda melakukan apa yang seharusnya Anda lakukan mengingat situasinya = denormalisasi
user3308043
3
Anda kehilangan saya ketika Anda mulai berbicara tentang mobil. Tidak tahu apa relevansinya.
JohnFx
2
Namun, bagaimana Anda melakukan kueri kompleks dalam skenario ini dengan tabel data tunggal, Anda tidak bisa, Anda harus sangat bergantung pada bahasa pemrograman dan berbagai hal lain untuk membuat ini berfungsi! Jadi, sebaiknya saya kembali ke tabel dengan 170 kolom, karena memiliki kueri "GABUNG" dan pemrograman ekstra kompleks yang diperlukan untuk membuat tabel terpisah berfungsi menurut saya seperti membuang-buang waktu. Saya kira saya adalah penggemar berat prinsip KISS.
Vlad Vladimir Hercules
0

Itu bukan masalah kecuali semua atribut dimiliki oleh entitas yang sama dan tidak bergantung satu sama lain. Untuk membuat hidup lebih mudah, Anda dapat memiliki satu kolom teks dengan array JSON yang disimpan di dalamnya. Tentunya, jika Anda tidak memiliki masalah dalam mendapatkan semua atribut setiap saat. Meskipun ini sepenuhnya akan menggagalkan tujuan penyimpanannya dalam RDBMS dan akan sangat mempersulit setiap transaksi database. Jadi pendekatan ini tidak disarankan untuk diikuti di seluruh database.

Zeeshan Ch
sumber
0

Memiliki terlalu banyak kolom dalam tabel yang sama juga dapat menyebabkan masalah besar dalam replikasi. Anda harus tahu bahwa perubahan yang terjadi di master akan mereplikasi ke slave .. misalnya, jika Anda memperbarui satu bidang dalam tabel, seluruh baris akan menjadi w

Hari ini
sumber