Apakah ini ide yang bagus untuk membuat tabel baru untuk setiap klien aplikasi web?

10

Ini semi-hipotetis, dan karena saya tidak punya pengalaman dalam berurusan dengan tabel database besar, saya tidak tahu apakah ini mengerikan karena suatu alasan. Ke situasi:

Bayangkan aplikasi berbasis web - katakanlah perangkat lunak akuntansi - yang memiliki 20.000 klien dan setiap klien memiliki 1.000 entri dalam tabel. Itu 20 juta baris yang saya tahu pasti bisa memperlambat permintaan kompleks.

Dalam kasus seperti ini, apakah lebih masuk akal untuk membuat tabel baru dalam database untuk setiap klien? Bagaimana database bereaksi memiliki 20k (atau lebih!) Tabel?

Akan
sumber

Jawaban:

15

Secara umum, tidak, tidak masuk akal untuk memiliki tabel (saya pikir maksud Anda sebenarnya database di sini) per pelanggan. 20 juta baris relatif kecil untuk tabel basis data. Kecepatan kueri terhadap hal itu seharusnya tidak menjadi masalah selama database disetel dengan benar (diindeks) dan kueri disatukan dengan benar. Apa pun manfaat yang Anda pikir akan dapatkan dari memisahkannya akan diimbangi dengan kompleksitas tambahan mengelola 20.000 basis data individu. Sebagai contoh, apa yang terjadi ketika Anda ingin mengubah struktur tabel? Anda sekarang harus melakukannya 20.000 kali!

Kasus yang lebih buruk, jika Anda akhirnya menemukan bahwa ukuran database menjadi masalah, Anda selalu dapat memisahkannya ke dalam basis data yang terpisah sesudahnya.

GrandmasterB
sumber
tidak, maksud saya benar-benar tabel dalam database. Saya tidak bisa membayangkan alasan untuk membuat database per klien. Dan jika 20 juta baris kecil, apa yang besar? Dan apa yang Anda lakukan pada saat itu?
Will
1
@ ChrisF, tepatnya - ada banyak kasus di mana teknologi atau model bisnis membutuhkan DB terpisah per klien. Tapi aku tidak bisa memikirkan alasan untuk tabel terpisah dalam DB yang sama .
GrandmasterB
1
@GrandmasterB - Saya pikir @Will menanyakan pertanyaan yang salah.
ChrisF
1
@Will: Jika mungkin, pergi ke pertemuan Oracle User Group, atau yang setara untuk beberapa database high-end lainnya. Anda akan menemukan bahwa ide-ide Anda "kecil" dan "besar" perlu banyak penyesuaian. Itu terjadi pada saya. Petunjuk: jika cocok pada satu disk, ukurannya tidak besar menurut standar DBA.
David Thornley
1
@Gorton, InnoDB umumnya dianggap lebih baik untuk keandalan dan concurrancy, MyISAM untuk kecepatan. Jadi, Anda benar-benar perlu mengevaluasi berbagai mesin penyimpanan berdasarkan pada penggunaan basis data aplikasi spesifik yang diharapkan.
GrandmasterB
5

Kedengarannya seperti ide yang buruk.

Jangan mencoba mengakali database dengan konstruksi eksotis seperti ini. Mesin basis data dirancang dengan banyak optimisasi untuk menangani set data besar. Misalnya, apa yang Anda gambarkan terdengar sangat dekat dengan upaya penerapan indeks secara manual. Cukup gunakan indeks yang disediakan oleh Mesin DB, mereka diimplementasikan jauh lebih baik daripada Anda mungkin akan dapat melakukannya sendiri, dan itu tidak akan memerlukan banyak pemeliharaan.

Juga, sebagai aturan umum. Saya menyarankan untuk tidak membuat basis data dengan cara yang membutuhkan manipulasi atau pembuatan struktur basis data (tabel, bidang) selama penggunaan normal aplikasi. Ini membuat pengoptimalan untuk kinerja menjadi berat dan sering memaksa Anda untuk memberikan terlalu banyak izin kepada pengguna untuk melakukan tugas rutin yang berpotensi menciptakan celah keamanan.

JohnFx
sumber
Saya akan memilih satu kali untuk masing-masing dua paragraf Anda jika diizinkan.
David Thornley
3

Berikut ini adalah artikel yang saya selalu minta orang untuk membaca, ketika mereka mengajukan pertanyaan ini:

http://datacharmer.blogspot.com/2009/03/normalization-and-smoking.html

Mchl
sumber
Saya tidak tahu bahwa DB membuat file aktual per tabel = x
Will
1
Ini mungkin tergantung pada RDBMS aktual yang digunakan. MySQL melakukan itu (hingga tiga file per tabel jika Anda menggunakan MyISAM). Orang lain mungkin tidak.
Mchl
SQL Server versi perusahaan akan melakukannya jika Anda mendesainnya seperti itu, tetapi tidak secara otomatis.
JeffO
Oracle jelas tidak melakukan itu.
user281377
Oracle dapat melakukannya, dengan cara yang sama seperti SQL Server dapat melakukannya, tapi saya tidak bisa membayangkan mengapa Anda pernah merancang skema Anda untuk memiliki satu file per tabel. Memisahkan database menjadi beberapa file masuk akal, tetapi tidak satu file per tabel.
Dean Harding
1

IMHO satu meja seharusnya tidak menjadi masalah, jadi jangan buat masalah di mana tidak ada - belum. Ada banyak yang dapat Anda lakukan untuk membantu kinerja. Anda bisa mempartisi satu tabel ke beberapa file berdasarkan clientID atau bidang tanggal untuk membantu dengan IO. Db Anda tidak harus melacak, mengoptimalkan, dan menyimpan 20.000 pernyataan sql yang berbeda untuk setiap kueri yang dibutuhkan situs Anda. Anda dapat mengindeks oleh clientid. Klien 20K dapat membayar banyak perangkat keras.

Untuk tipe tabel ini, tipe NoSQL db dapat digunakan.

Dengan 20K klien, basis data mungkin bukan tautan terlemah Anda, jadi mengapa harus memperkenalkan kompleksitas sebanyak ini?

JeffO
sumber
`Anda dapat mempartisi satu tabel ke banyak file berdasarkan clientID atau bidang tanggal untuk membantu IO.` - tidak yakin apa yang Anda maksud dengan ini. Ada klarifikasi?
Will
Banyak file di sistem operasi. Server dapat melakukan lebih banyak membaca / menulis ke banyak file, bukan hanya satu.
JeffO
Saya kira maksud saya: Saya belum pernah mendengar hal seperti itu, di mana saya menemukan informasi lebih lanjut tentang melakukan ini? :-) Tapi saya akan klik google ~
Will
msdn.microsoft.com/en-us/library/ms345146(v=sql.90).aspx Anda dapat mengalami masalah kinerja cadangan jika indeks berada di file yang terpisah dari tabel yang diindeks (atau mungkin drive?).
JeffO
0

Itu pendekatan yang sangat buruk.

Partisi tabel secara vertikal, 2 server database satu untuk id pengguna ganjil, dan yang lain untuk bahkan harus bekerja dengan baik (data tidak terkait antara pengguna).

Urutkan data berdasarkan user_id dan jika itu tidak memungkinkan, dapatkan sejumlah besar RAM atau disk SSD.

Slawek
sumber