Hindari data yang diketik dengan string dengan mengganti VALUE
dengan NUMBER_VALUE
, DATE_VALUE
, STRING_VALUE
. Ketiga tipe tersebut cukup baik hampir sepanjang waktu. Anda dapat menambahkan XMLTYPE dan kolom mewah lainnya nanti jika diperlukan. Dan untuk Oracle, gunakan VARCHAR2 sebagai ganti CHAR untuk menghemat ruang.
Selalu mencoba untuk menyimpan nilai sebagai tipe yang benar. Tipe data asli lebih cepat, lebih kecil, lebih mudah digunakan, dan lebih aman.
Oracle memiliki sistem tipe data generik (ANYTYPE, ANYDATA, dan ANYDATASET), tetapi tipe tersebut sulit digunakan dan harus dihindari dalam banyak kasus.
Arsitek sering berpikir menggunakan satu bidang untuk semua data membuat segalanya lebih mudah. Itu membuatnya lebih mudah untuk menghasilkan gambar-gambar cantik dari model data tetapi itu membuat segalanya lebih sulit. Pertimbangkan masalah berikut:
- Anda tidak dapat melakukan sesuatu yang menarik dengan data tanpa mengetahui jenisnya. Bahkan untuk menampilkan data itu berguna untuk mengetahui jenis untuk membenarkan teks. Dalam 99,9% kasus kiasan akan jelas bagi pengguna mana dari 3 kolom yang relevan.
-
Mengembangkan kueri tipe-aman terhadap data yang diketik secara string itu menyakitkan. Misalnya, Anda ingin mencari "Tanggal Lahir" untuk orang yang lahir di milenium ini:
select * from ReportFieldValue join ReportField on ReportFieldValue.ReportFieldid = ReportField.id where ReportField.name = 'Date of Birth' and to_date(value, 'YYYY-MM-DD') > date '2000-01-01'
Bisakah Anda menemukan bugnya? Kueri di atas berbahaya, bahkan jika Anda menyimpan tanggal dalam format yang benar, dan sangat sedikit pengembang yang tahu cara memperbaikinya dengan benar. Oracle memiliki optimasi yang membuatnya sulit untuk memaksakan urutan operasi tertentu. Anda memerlukan kueri seperti ini agar aman:
select * from ( select ReportFieldValue.*, ReportField.* --ROWNUM ensures type safe by preventing view merging and predicate pushing. ,rownum from ReportFieldValue join ReportField on ReportFieldValue.ReportFieldid = ReportField.id where ReportField.name = 'Date of Birth' ) where to_date(value, 'YYYY-MM-DD') > date '2000-01-01';
Anda tidak ingin harus memberi tahu setiap pengembang untuk menulis kueri mereka seperti itu.