Terlepas dari tipe data tertentu, Anda harus dapat menyimpan apa pun permintaan aplikasi untuk disimpan. Anda tidak dapat menentukan sesuatu yang lebih kecil dari ukuran maksimum dari apa yang sebenarnya akan disimpan.
Anda juga tidak perlu, atau ingin, untuk menentukan panjang kolom lebih besar dari ukuran sebenarnya maksimum yang akan disimpan karena berbagai alasan: kueri alokasi memori, berpotensi mengisi ukuran baris maksimum dan tidak meninggalkan ruang untuk menambahkan kolom di masa depan, dll.
Benar, variabel panjang string dan kolom biner tidak memiliki implikasi penyimpanan yang tipe data panjang-tetap (string / binary / numeric / date / dll) lakukan (walaupun, beberapa implikasi tersebut dapat dibatalkan melalui kompresi data atau penggunaan SPARSE
definisi kolom. pilihan). Namun, seperti yang Anda tunjukkan, bahkan jika tidak ada implikasi penyimpanan langsung, masih ada implikasi kinerja terlalu tinggi memori yang diperlukan untuk permintaan.
Masuk akal. Gunakan hanya apa yang Anda butuhkan. Pertimbangan dapat dibuat jika ada kemungkinan tinggi bahwa panjang kolom akan perlu meningkat dalam waktu dekat, tetapi perlu diingat bahwa lebih mudah untuk memperluas ukuran kolom daripada mengurangi ukuran. Ya, beberapa pekerjaan akan terlibat, tetapi karena pekerjaan itu hanya "potensial", sementara implikasi kinerja over-sizing adalah "aktual", seringkali lebih baik untuk mendefinisikan kolom berdasarkan pada apa yang sebenarnya Anda butuhkan, bukan apa yang Anda mungkin-agak -sorta pikir Anda mungkin perlu di masa depan. Banyak perubahan yang dibicarakan tidak pernah terjadi, dan seringkali perubahan yang diperlukan tidak dapat diramalkan. Pergilah dengan apa yang Anda ketahui.
Alih-alih, sasaran mungkin untuk membatasi ukuran aktual setiap baris data hingga ~ 8000 byte jika memungkinkan.
Saya tidak yakin apa yang Anda dapatkan di sini. SQL Server secara fisik akan membatasi Anda hingga lebih dari 8000 byte. Menggunakan jenis LOB - VARCHAR(MAX)
, NVARCHAR(MAX)
, VARBINARY(MAX)
, XML
, dan usang TEXT
, NTEXT
dan IMAGE
jenis - memungkinkan untuk melampaui bahwa pembatasan ukuran halaman awal, tapi itu hanya karena menempatkan pointer (16 atau lebih byte, tergantung pada jenis, dan tergantung pada ukuran nilai yang disimpan secara off-line saat menggunakan MAX
tipe). Batas fisik sebenarnya dari halaman data tidak berubah.
Sasaran Anda adalah menggunakan ruang fisik paling sedikit untuk menyimpan apa yang dibutuhkan aplikasi / bisnis tanpa merusak atau memotong sehingga nilai yang tidak lengkap kehilangan makna atau menyebabkan masalah di hilir. Jika Anda perlu menyimpan 12.000 karakter, kemudian gunakan VARCHAR(MAX)
karena itulah yang diperlukan. Jika Anda menyimpan nomor telepon atau kode pos, maka itu tidak bijaksana untuk digunakan VARCHAR(100)
, dan tidak bertanggung jawab untuk menggunakannya VARCHAR(MAX)
.
beberapa data pelanggan kami sedikit berfluktuasi, jadi kami biasanya membuat kolom sedikit lebih lebar dari yang seharusnya, katakanlah 15-20% lebih besar, untuk kolom tersebut. Saya bertanya-tanya apakah ada pertimbangan khusus lainnya;
Bukankah semua sistem memiliki setidaknya beberapa data yang berfluktuasi? Sistem apa pun yang menyimpan nama seseorang akan memenuhi syarat, bukan? Ada variasi yang cukup besar dalam panjang nama. Dan kemudian Anda memiliki seseorang seperti Pangeran pergi dan mengubah nama mereka menjadi simbol dan sekarang Anda memiliki masalah yang sama sekali berbeda yang tidak panjang. Begitulah keadaannya.
Tetapi, untuk berperan sebagai advokat iblis untuk sesaat: bagaimana mungkin nilai "15-20% lebih besar dari yang dibutuhkan" tidak menjadi nilai yang sebenarnya dibutuhkan ? Katakanlah ada diskusi tentang menambahkan kolom baru, dan seseorang menyarankan 50 karakter, lalu orang lain berkata, "20% lebih banyak adalah 60, jadi mari kita lakukan 60 karena seseorang mungkin memiliki 60." Jika benar bahwa pelanggan mungkin memiliki 60, maka 60 adalah, dan selalu, nilai yang sebenarnya dibutuhkan, dan 50 salah sepanjang waktu.
Tentu saja, akan membantu jika ada beberapa indikasi mengenai sumber data karena:
- jika Anda membuat "URL" 1024 dan seseorang membutuhkan 1060, maka itu harus 1060 (sama halnya, jika Anda membuat URL
VARCHAR
dan mendapatkan keluhan bahwa itu mengacaukan karakter Unicode yang sekarang diizinkan dalam nama domain, maka itu harus NVARCHAR
), tapi
- jika seseorang ingin menambahkan 1000 karakter ke bidang komentar batas-500 karakter, maka itu hanya perlu menjadi 500. Orang-orang dapat kurang bertele-tele dalam komentar (tantangan besar bagi saya ;-), tetapi
ProductSKU
lebih baik cukup besar untuk memenuhi semua SKU pelanggan.
Saya berbicara tentang pembuatan tabel awal. Seorang pelanggan akan memberi tahu kami bahwa mereka akan mulai mengirimkan kepada kami tabel baru, dan mengirimkan data sampel (atau hanya dataset produksi pertama), yang kami lihat dan buat tabel di ujung kami untuk menyimpan data. Kami ingin membuat tabel di pihak kami untuk menangani impor di masa depan serta apa yang ada dalam sampel. Tapi, baris-baris tertentu pasti akan lebih panjang, jadi kami pad mereka. Pertanyaannya adalah berapa banyak, dan apakah ada pedoman teknis?
Anda membuat banyak asumsi di sini. Tentu beberapa bidang mungkin menjadi lebih besar. Tetapi sekali lagi, mereka mungkin tidak. Atau, beberapa bisa menjadi lebih kecil. Beberapa dapat berubah dari non-Unicode menjadi Unicode (begitu mereka menyadari bahwa dunia semakin kecil dan orang tidak dapat berasumsi bahwa nama-nama terakhir hanya akan memiliki karakter ASCII / US English dasar). Atau, mereka bisa berhenti mengirim bidang. Atau mereka dapat menambahkan satu atau beberapa bidang di masa mendatang. Kombinasi apa pun dari ini dan hal-hal lain. Jadi mengapa hanya fokus pada VARCHAR
kolom? Bagaimana jika mereka saat ini mengirimkan INT
nilai dan dalam satu atau dua tahun mereka mencapai nilai maksimal dan mulai mengirim nilai BIGINT
? Bagaimana jika mereka memiliki bidang "status" dengan nilai 0 - 5. Apakah Anda hanya akan menganggapINT
yang "empuk" karena memungkinkan untuk pertumbuhan, tetapi mungkin seharusnya TINYINT
?
Satu-satunya hal yang dapat Anda prediksi dengan aman adalah mencoba memprediksi bagaimana data pelanggan Anda akan berubah lebih sering salah daripada benar. Dan menjadi benar adalah masalah keberuntungan / kebetulan (jika bukan keberuntungan, maka mainlah lotere;).
Jadi pedomannya adalah:
- Jangan buang waktu dan energi untuk mencoba menjawab pertanyaan yang tidak bisa dijawab.
- Alih-alih, fokuslah untuk mendapatkan sebanyak mungkin informasi mengenai data aktual pelanggan Anda, dan lakukan itu (yaitu pengambilan keputusan berdasarkan data ;-).
Anda sudah memiliki contoh data, bagus. Tetapi, jangan lupa bahwa Anda juga memiliki info kontak pelanggan Anda: telepon dan / atau email. Hubungi mereka! Tanyakan spesifikasi data mereka (seperti sistem Anda, data yang saat ini ada di sistem mereka mungkin memiliki panjang maksimal 35, tetapi sistem mereka menetapkannya sebagai VARCHAR(50)
, dan sistem mereka akan menerima hingga sejauh itu, dalam hal ini Anda harus menggunakan 50). Dan, tanyakan kepada mereka apakah mereka memiliki rencana jangka pendek untuk mengubah dan tipe-tipe data tersebut (tipe dan / atau ukuran).