Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Pola Desain untuk Bidang Kustom dalam Basis Data Relasional

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:

  1. 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.
  2. 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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara mengekspor bidang gambar ke file?

  2. LOG10() Contoh di SQL Server

  3. Cara Memilih Setiap Baris Di Mana Nilai Kolom TIDAK Berbeda

  4. datetime vs smalldatetime di SQL Server:Apa Bedanya?

  5. SQL Server - Apa yang terjadi ketika baris dalam tabel diperbarui?