Apa keseimbangan yang baik antara menggunakan kembali bidang versus membuat yang baru dalam konteks skalabilitas bidang?

34

Saya telah membaca frasa berikut di situs web:

Alih-alih menambahkan bidang baru ke jenis konten, menambahkan bidang yang ada adalah pilihan yang lebih baik untuk mengurangi kompleksitas sistem dan meningkatkan skalabilitas.

Dan beberapa keraguan muncul.

Dalam sistem yang kami kembangkan, kami memiliki kemungkinan untuk menggunakan kembali bidang di 3 atau 4 jenis konten tetapi alih-alih meningkatkan skalabilitas seperti ungkapan yang dikutip, saya khawatir itu akan menguranginya, karena tabel bidang akan lebih cepat menjadi hambatan. (Setidaknya itulah alasan saya dalam kasus ini, karena semua nilai bidang itu bersama-sama, akan menjadi beberapa juta per tahun dan itu akan membuat tabel terlalu besar). Apa kamu setuju?

Berapa banyak baris akan menjadi maksimum yang masuk akal untuk membidik ketika merancang? Dengan begitu kita bisa memutuskan kapan harus menggunakan kembali bidang dan kapan membuat yang baru (meskipun ada kesempatan untuk menggunakan kembali).

rafam
sumber
6
Saya ingin melihat jawaban yang didukung dengan metrik yang sebenarnya.
mpdonadio
Berpikir kami telah mengumpulkan komentar yang sangat konstruktif dan informatif seputar pertanyaan ini. Namun, saya akan menunggu satu atau dua hari sebelum menandai sebagai dijawab, karena sesuatu dalam diri saya bersikeras bahwa memisahkan satu atau dua bidang yang paling berat (meskipun dapat digunakan kembali) bisa menjadi ide yang bagus :) ... khusus mengetahui mereka fileds dapat dengan mudah tumbuh 5, 10 atau 20 juta item per tahun.
rafamd

Jawaban:

24

Jumlah data dalam suatu bidang biasanya tidak menjadi masalah. Jika Anda khawatir tentang itu, lihat ke plugin penyimpanan lapangan alternatif atau tulis sendiri. Misalnya MongoDB , yang dapat menangani hampir semua yang Anda masukkan ke dalamnya. Ini misalnya digunakan di http://examiner.com .

Sebuah nyata masalah namun adalah jumlah bidang yang Anda miliki. Karena saat ini dalam Drupal 7, konfigurasi bidang lengkap dari semua bidang, tidak peduli apakah itu dimuat atau tidak, diambil dari cache pada setiap permintaan tunggal.

Saya telah melihat situs dengan lebih dari 250 bidang, tempat memuat dan membatalkan instalasi konfigurasi bidang membutuhkan memori 13MB +.

Sunting: Cache info bidang telah diperbaiki (lihat http://drupal.org/node/1040790 untuk detail) dengan Drupal 7.22, hanya bidang bundel yang ditampilkan pada halaman tertentu yang dimuat dari cache dan semuanya entri cache yang terpisah. Itu hanya berfungsi jika tidak ada panggilan API yang salah yang meminta instance di beberapa bundel.

Berdir
sumber
Hai Berdir, terima kasih atas jawaban Anda. Saya tidak tahu tentang overhead itu untuk jumlah bidang. Jadi, kita harus mencoba untuk menggunakan kembali sebanyak mungkin, tetapi tetap saja, bukankah kita harus mencoba untuk membagi yang kita tahu adalah yang paling berat? Saya tidak tahu banyak tentang mongo dan sejenisnya, tetapi apakah mereka benar-benar tidak peduli tentang ukuran kelompok yang harus mereka tanyakan? terima kasih!
rafamd
Saya sebenarnya tidak tahu. Tergantung, kurasa. Melakukan tes seperti yang disarankan GKG mungkin bukan ide yang buruk. Anda bahkan dapat membandingkannya dengan tingkat yang sangat rendah secara langsung di Mysql. Buat dua tabel dengan tata letak dan indeks yang sama dengan tabel data bidang, tulis 10m (pastikan untuk benar-benar menggunakan nilai yang berbeda untuk entitas_id) baris menjadi satu dan 5m ke dalam yang kedua. Kemudian bandingkan kinerja penulisan dan kinerja baca (berdasarkan pada entitas_id alias indeks). Saya menduga bahwa kinerja membaca akan hampir sama berkat indeks tetapi kinerja menulis dapat membuat perbedaan.
Berdir
Yang mengatakan, memiliki beberapa bidang kurang lebih tidak akan benar-benar membuat perbedaan jadi jika Anda merasa lebih nyaman seperti itu, itu seharusnya tidak menjadi masalah.
Berdir
Menulis adalah bagian yang sulit, maka rekomendasi saya tentang melakukan tes. Apa yang mungkin berlawanan dengan intuisi adalah fakta bahwa MySQL menjatuhkan entri yang di-cache berdasarkan tabel dan bukan baris (terakhir kali saya memeriksa). Saya tidak yakin yang akan lebih berdampak, overhead memori dari beberapa bidang dan tabel atau cache-misses dari menulis ke tabel yang sama. Itu pasti tergantung lalu lintas / penggunaan. Sistem dengan banyak cache (Drupal cache, APC opcode, pengguna APC, cache query MySQL, memcached, varnish, dll) membuat keputusan berbasis usus sangat sulit tanpa membuat profil.
mpdonadio
ini bukan lagi masalahnya: drupal.org/node/1040790
jackbravo
13

Saya sepenuhnya setuju dengan berdir. Berikut adalah pengalaman saya dengan proyek dengan jutaan baris dan 30-40 bidang pada beberapa jenis simpul.

  1. Jumlah baris dalam tabel bidang bukan masalah besar untuk kinerja baca, karena semua bidang diambil oleh kunci utama.
  2. Jumlah bidang per jenis simpul dapat dengan cepat tumbuh menjadi masalah kinerja besar saat menulis node baru. Memiliki 30+ bidang untuk satu jenis simpul akan menghasilkan 60+ pernyataan INSERT saat Anda membuat simpul baru. Ini membutuhkan beberapa detik untuk menyelesaikannya. Jika Anda pengguna membuat banyak data, ini akan memukul kinerja Anda. Sisipan massal 1000 node akan memakan waktu hampir satu jam. Jika Anda harus memperbarui 100'000 node, ini adalah masalah besar.
  3. Jika Anda berpikir jumlah masalah bidang akan menghantam Anda, Anda harus serius memikirkan untuk menulis penyimpanan bidang Anda sendiri atau tidak menggunakan bidang. (Anda masih bisa membuat simpul Anda bekerja dengan tampilan dengan sedikit usaha ekstra.)
  4. Sepatah kata tentang MongoDB. Ini adalah proyek yang sangat menarik dan saya harap ini berhasil menjadi olymp dari DB besar. Sayangnya dibandingkan dengan jatuh tempo MySql atau PgSql itu bayi. Bersiaplah untuk berurusan dengan produk yang sangat muda.
BetaRide
sumber
Hai @BetaRide, terima kasih atas wawasan Anda. Tentang 2), kami sudah berusaha meminimalkan jumlah bidang per jenis konten dan itu bukan yang kami bahas di sini. Sebenarnya adalah: haruskah saya menggunakan kembali secara membabi buta bidang bila memungkinkan atau haruskah saya mencoba (paling tidak) memisahkan satu atau dua yang paling berat secara terpisah (walaupun mereka dapat dengan mudah sama misalnya: mereka sebenarnya memiliki nama yang sama, dll). Ya, mongo harus menjadi alternatif terakhir kami untuk saat ini :)
rafamd
5

Jika Anda benar-benar khawatir tentang apa yang akan terjadi, maka saya pikir simulasi dilakukan.

Dapatkan akun di Rackspace Cloud, Amazon, Linode, atau di mana pun Anda dapat dengan mudah memutar VPS. Buat dua contoh yang identik. Instal Drupal di masing-masing. Buat beberapa jenis konten dummy, dan atur bidang satu arah dalam satu sistem, dan cara lainnya lainnya di lainnya. Gunakan modul devel untuk membuat konten muatan kapal. Sesuaikan pengaturan kinerja untuk memastikan Drupal caching sesuai kebutuhan. Jalankan mysqltuner dan sesuaikan MySQL pada setiap rekomendasi. Periksa pengaturan PHP dan APC sehingga Anda tidak memukul swap dan bahwa Anda tidak mengaduk cache APC.

Setelah Anda mendapatkan konfigurasi dasar yang baik untuk masing-masing, mulailah mensimulasikan lalu lintas (baik pengunjung normal maupun pembaruan admin) dengan wget dan drush, lalu profil.

Simulasi tidak pernah sempurna, tetapi bisa membuat Anda bergerak ke arah yang benar.

mpdonadio
sumber
2

Satu masalah dengan skalabilitas dalam bidang dalam penggunaan indeks pada setiap bidang tabel tunggal di setiap bidang dalam tabel yang dibuat. Indeks berkerumun kunci utama adalah gabungan dari sebagian besar bidang, lalu dibuat indeks terpisah pada setiap individu bidang. Indeks membuat satu ton overhead menulis untuk database, dan dalam banyak kasus tidak pernah digunakan.

jozwikjp
sumber
2

tip lain: memiliki banyak bidang akan menyebabkan masalah dengan banyak modul yang berbeda juga. GUI Token misalnya akan membuat browser Anda ketinggalan selama beberapa menit jika Anda mencoba mengedit alias URL misalnya. Perilaku ini dapat dilihat pada semua halaman di mana token akan dimuat dan ditampilkan (termasuk devel - dpm () dll.)

Tidak ada manfaat kinerja dalam memisahkan data ini di beberapa tabel saat menggunakan InnoDB (MyISAM berbeda karena penguncian tabel). Jadi - jika Anda tahu Anda akan memiliki banyak tipe konten yang serupa dengan bidang yang sama (konfigurasi yang juga akan sama, mungkin berbeda dalam pelabelan saja) menggunakan kembali bidang Anda!

Mungkin juga mempermudah pembuatan template karena atribut simpul yang sama.

Andre Baumeier
sumber
1

Hanya berbagi cerita saya, kami menggunakan Drupal Commerce dan memiliki sekitar 40 bidang dalam variasi produk kami (Sku) dan kemudian 460 lainnya (ya, gila) di Tampilan Produk kami. Kami memiliki beberapa tampilan perbandingan produk yang akan melihat semua bidang ini. Tanpa caching, beberapa halaman bisa memakan waktu hingga satu menit!

Namun, itu berhasil. Jika Anda memang menggunakan caching dan Varnish, waktu tunggu pengguna tidak seburuk itu.

Masalah utama yang kami hadapi dengan begitu banyak bidang adalah dengan Display Suite, karena itu akan menjadi sangat lambat (kadang-kadang tidak responsif) jika kami mencoba mengatur ulang atau memindahkan bidang di sekitar.

Untungnya, kami memutuskan untuk memfaktorkan ulang produk kami sedikit sehingga mudah-mudahan kami bisa mendapatkan jumlah maksimum bidang kami ke kisaran 200-250 untuk produk kami yang paling kompleks (kami berada di instrumentasi ilmiah, sehingga diperlukan pengukuran dan spesifikasi yang kompleks) .

Waterskier19
sumber
0

Itu pertanyaan yang menarik. Saya sudah memikirkan hal ini sebelumnya, kadang-kadang menggunakan kembali suatu bidang bisa menjadi nyaman untuk tidak memiliki banyak bidang serupa 'berbaring' tetapi sepertinya konyol memiliki jenis konten tertentu karena harus memilih dari banyak data yang kami tahu tidak dimaksudkan untuk dikembalikan pada hasil.

Saya perlu sedikit info lebih lanjut tentang proyek ini untuk memberi saran tentang praktik terbaik untuk penskalaan. Berapa lalu lintas yang diharapkan, berapa banyak dari pengguna tersebut yang akan masuk dll? Misalnya, jika semua lalu lintas kecuali pengguna admin Anda tidak diauthentikasi dan di-cache secara anonim

joevallender
sumber
Hai @drupaljoe, terima kasih atas balasan Anda. Lalu lintas yang diharapkan sulit diperkirakan, karena ini adalah situs yang benar-benar baru. Ini sedang dikembangkan dengan sangat hati-hati dan kami mengharapkan semacam kesuksesan, jadi katakanlah kami berhasil memiliki beberapa ratus pengguna secara bersamaan (kebanyakan dari mereka diautentikasi). Itulah yang saya pikirkan, menanyakan tabel besar itu pasti menyebalkan, jadi mungkin kita harus arsitek untuk menggunakan kembali bidang-bidang yang tidak akan tumbuh terlalu banyak dan memisahkan yang akan menampung lebih banyak data. Apa yang bisa dianggap terlalu banyak? 1 juta ? 100 juta ? 300 juta ? ...
rafamd
Saya pikir komentar dari dua yang lain tentang bagaimana itu seharusnya tidak terlalu penting karena pilihan berada pada kunci utama adalah poin yang baik. Saya kira saya akan mengatakan hanya pergi dengan itu untuk saat ini tetapi pastikan Anda telah membaca tentang pilihan Anda untuk masa depan, mongo untuk bidang dll. Anda tidak dapat selalu menebak segala sesuatu tentang masa depan situs Anda
joevallender
0

Saya sejauh ini selalu menggunakan kembali bidang tetapi sekarang saya mempertimbangkan untuk menggunakan bidang unik per jenis node untuk proyek baru. Saya sebenarnya ingin menyimpan semuanya dengan baik (bidang, tampilan, aturan, konteks, dll) untuk setiap bundel entitas. Jadi itu mengangkat pertanyaan tentang skalabilitas yang menuntun saya ke sini. Saya terhibur dengan hasil edit Berdir (Cache info bidang telah diperbaiki (lihat http://drupal.org/node/1040790 untuk detail) dengan Drupal 7.22, hanya bidang bundel yang ditampilkan pada halaman tertentu yang diambil dari cache dan keduanya entri cache yang terpisah. Itu hanya berfungsi jika tidak ada panggilan API yang salah yang meminta instance di beberapa bundel).

Saya hanya ingin menunjukkan bahwa ada modul yang sangat menarik yang telah saya gunakan selama berbulan-bulan di beberapa situs yang kompleks .: https://www.drupal.org/project/render_cache . Itu salah satu permata tersembunyi menurut saya.

Seperti yang tertulis di halaman proyek, bagian komentar sebenarnya digunakan pada DO itu sendiri.

Jadi, dengan semua itu dalam pikiran, akankah itu mengubah konsensus yang mendukung bidang yang berbeda? Peringatan yang disebutkan tentang DS masih mengecewakan. Ini sangat mengganggu cara menyimpannya melalui ajax alih-alih, misalnya, bagaimana antarmuka administrasi blok inti menangani pemesanan ulang. Saya merasa ini adalah masalah ds, meskipun ...

Oscar
sumber
-3

Sesuai saran saya Menggunakan bidang yang sama dalam tipe konten yang terpisah adalah ide bagus. Karena itu akan meningkatkan kinerja situs Anda. Di Drupal 7, Ketika Anda menggunakan operasi pilih waktu itu, Menggunakan bidang yang sama dalam tipe konten benar-benar Berguna untuk situs Drupal7 Anda.

purab
sumber
1
Di Drupal 7, mereka mulai menggunakan Doctrine ORM ... tidak. Drupal 8 bahkan tidak menggunakan Doctrine
Clive
"Doktrin selalu mengembalikan objek dari semua data yang dipetakan", juga merupakan pernyataan yang salah. Objek dapat dijelaskan untuk menunjukkan kepada doktrin bahwa perilaku default tidak cocok. Bukan berarti itu sangat relevan, mengingat, seperti yang dikatakan Clive, Drupal tidak menggunakan Doktrin.
Letharion