NoSQL dalam SQL Server

28

Pertanyaan ini bukan tentang perbedaan antara SQL dan NoSQL. Saya mencari alasan untuk sesuatu yang benar-benar tidak masuk akal bagi saya saat ini (mungkin karena kurangnya pemahaman atau penghargaan saya).

Kami telah memulai proyek baru dari awal menggunakan MVC5, kode kerangka kerja Entity 6 pertama dan SQL Server 2008. Ketika arsitek meninjau skema database dinyatakan bahwa semua kunci asing dan kendala lain harus dihapus karena ini adalah "logika bisnis" dan harus diterapkan dalam lapisan bisnis kode aplikasi.

Pendapat saya adalah kunci asing merupakan bagian dari integritas data / referensial dan tidak benar-benar meniru logika bisnis. Saya melihat logika bisnis lebih sebagai proses dan validasi yang mengontrol apa / kapan / bagaimana / mengapa referensi diterapkan. Saya bisa mengerti bahwa kendala unik bisa dibilang proses bisnis, tetapi bagi saya ini hanya melengkapi logika dan membentuk bagian dari integritas.

Argumen kedua adalah tujuannya adalah untuk mengadopsi pendekatan NoSQL terhadap data. Saya menemukan ini benar-benar tidak biasa dan tidak lazim: mempertimbangkan penggunaan SQL-Server 2008, kebutuhan untuk pelaporan, data yang tidak scaling ke terabyte dan kurangnya pertimbangan terhadap teknologi seperti Mongo, Raven, dll.

Adakah yang pernah mengalami skenario seperti itu sebelumnya? Mengapa ada orang yang mengadopsi pendekatan NoSQL dalam SQL Server yang dirancang untuk data referensial dan tidak ingin kunci asing?

Andy Clark
sumber
21
Bicaralah dengan arsitek sistem Anda tentang alasan nasihatnya. Entah ia memiliki alasan yang sangat bagus yang berlaku untuk kasus spesifik Anda (alasan yang tidak dapat kami duga, tanpa tahu persis apa yang terdiri dari aplikasi Anda), atau dia hanya tidak kompeten.
Arseni Mourzenko
23
Saya telah melihat banyak basis data diimplementasikan dengan cara yang serupa: tidak ada FK, tidak ada kendala PERIKSA — setiap kali itu adalah basis data yang dirancang oleh pembuat kode yang tidak berpengalaman yang tidak tahu apa-apa tentang arsitektur basis data, integritas referensial, dll. Tetapi penting bagi Anda untuk membahasnya dengan kolega Anda, alih-alih hanya dengan menganggap bahwa ia tidak kompeten.
Arseni Mourzenko
5
Saya sedikit bingung; Anda menyebutkan menggunakan kerangka kerja Entity (kode terlebih dahulu) ... tidak menyiratkan bahwa Anda membuat Objek (dalam arti C #) dan kemudian biarkan kerangka kerja Entitas menangani membangun setara database, dalam hal ini mencoba untuk menambah / menghapus FK dll adalah latihan dalam mencoba mengakali Entity Framework (yang mirip dengan kutipan Mark Twain tentang mencoba mengajar seekor babi bernyanyi?)
Foon
2
Ada terlalu banyak orang yang mengklaim diri mereka "arsitek", tetapi sebenarnya tidak memiliki pengalaman dalam pengkodean atau pemeliharaan sistem yang lebih besar.
Doc Brown
2
Relevan: thedailywtf.com/articles/The-Mythical-Business-Layer . "Jika Anda memikirkannya, hampir setiap baris kode dalam aplikasi perangkat lunak adalah logika bisnis." Ini meluas ke database. "Tapi itu sama pentingnya - jika tidak lebih - untuk diingat bahwa hampir semua kode aplikasi akan menjadi logika bisnis. Sudah ada cukup alat di luar sana; aplikasi Anda tidak memerlukan lapisan generik " (penekanan saya). Orang yang merekomendasikan ini mungkin mencoba mengubah database menjadi satu lapisan generik. Singkatnya, mereka cenderung menempatkan kata kunci di atas kenyataan.
jpmc26

Jawaban:

74

Ketika dia meninjau skema basis data, dia menyatakan bahwa semua kunci asing dan batasan lainnya harus dihapus karena ini adalah logika bisnis dan harus diterapkan dalam lapisan bisnis.

Lalu dia idiot, dan beberapa kutipan dari basis kode Anda kemungkinan akan berakhir di The Daily WTF suatu hari nanti. Anda benar bahwa pendekatannya tidak masuk akal, dan terus terang juga tidak penjelasannya.

Coba jelaskan kepadanya bahwa batasan integritas referensial bukan "logika bisnis"; mereka adalah standar kebenaran dengan verifikasi bawaannya sendiri. Logika bisnis adalah tentang apa yang Anda lakukan dengan data; integritas adalah tentang memastikan bahwa data itu sendiri tidak rusak. Dan jika itu tidak berhasil ... yah, dia yang berkuasa. Anda dapat mengikuti rencananya dan mencoba mengurangi kerusakan, atau mulai mencari tempat yang lebih baik untuk bekerja. (Atau keduanya.)

Mason Wheeler
sumber
17
Saya memiliki jawaban yang sedikit lebih diplomatis yang mencoba menemukan alasan (waras) mengapa arsitek mungkin melakukan ini. Pada renungan yang tenang, saya mendapatkan jawaban ini sebagai gantinya.
Blrfl
7
Wah, upaya arsitektur yang buruk adalah alasan untuk bekerja di tempat lain? Sial, aku tidak akan pernah bisa terus bekerja di mana pun jika aku mengambil pandangan itu.
Kzqai
5
@ Kzqai ada juga arsitek yang secara mendasar salah paham tentang arsitektur. Ini mulai terdengar seperti arahan 595 dan ya, jika seseorang ingin memaksa saya menggunakan palu untuk memasukkan sekrup ke sepotong kayu, saya akan menemukan seseorang yang tidak memaksa saya untuk menyalahgunakan alat untuk membangun sesuatu.
4
Integritas referensial adalah topik inti dalam teori database, belum lagi semua database yang mendukungnya di dunia nyata. Jelas rekan kerja Andy benar dalam analisisnya, seluruh dunia akademis dan profesional 100% salah. Poin bonus untuk menyebutkan The Daily WTF .
2
@AndyClark Anda harus berhenti karena ini. Alasannya adalah bahwa ini adalah bom waktu nuklir di inti perusahaan Anda. Ini hanya masalah waktu ketika tinja menimpa ventilator. Ketika itu terjadi, Anda akan beruntung bekerja dalam shift 72 jam, skenario terburuk Anda akan mencari pekerjaan ... lebih baik mencari pekerjaan ketika Anda memiliki penghasilan.
ArTs
2

Saya belum punya alasan untuk membuat kunci asing

- Joel Spolsky

Selain pernyataan blanket, ada baiknya mengakui ada alasan kuat dan kuat untuk memilih untuk tidak menggunakan keunikan atau batasan kunci asing. Sebagian besar berjalan seperti ini:

  • Performa. Melakukan pemeriksaan integritas dengan transaksi atom tidak gratis. Dan seringkali, basis data adalah bagian paling sulit dari arsitektur Anda untuk diukur. Mungkin Anda sudah melakukan pemeriksaan dalam logika aplikasi Anda, dan lebih suka tidak terkena hit kinerja kedua.
  • Kurangnya kebutuhan. Mungkin data Anda kotor, dan Anda setuju dengan itu. Ini sangat tergantung pada apa yang Anda lakukan.

Lihat juga Apa yang salah dengan kunci asing?


Tetapi itu tidak sesuai dengan alasan dalam pertanyaan Anda.

Ini adalah logika bisnis dan harus diterapkan dalam lapisan bisnis.

Alasan ini agak aneh. Keunikan dan kendala integritas lainnya adalah domain dari database ACID. Kode aplikasi Anda tidak dapat mendekati jaminan atomitas dan integritas SQLServer. Jika Anda membutuhkan integritas data yang kuat, Anda akan bodoh mengabaikan database.

Argumen kedua adalah bahwa mereka ingin mengadopsi pendekatan NoSQL untuk penyimpanan data mereka sehingga tidak ingin pembatasan seperti itu diberlakukan.

Alasan kedua sebenarnya bukan alasan; itu sebuah kesimpulan. Meskipun memang benar bahwa kendala adalah trade-off antara kebenaran dan kinerja, dan database NoSQL bias terhadap yang terakhir.


Mungkin arsitek sistem Anda memiliki alasan yang sah dalam pikiran, dan Anda salah dengar. Atau mungkin dia idiot.

Bagaimanapun, ada yang valid (meskipun tidak alasan universal) untuk menahan diri dari menggunakan keunikan dan batasan kunci asing.

PS Jika Anda menyimpulkan bahwa Anda tidak ingin kunci asing, masih boleh menggunakan database relasional. Sebagai generalisasi, database relasional lebih matang daripada rekan-rekan NoSQL mereka. Sebagai node tunggal, mereka bahkan bisa lebih cepat , dan abstraksi NoSQL dapat dibangun di atasnya .

Paul Draper
sumber
12
Saya berani mengatakan Joel bukan idiot, tetapi balasan cerdas dalam podcast, tanpa penjelasan apa pun, IMHO, bahkan bernilai lebih rendah daripada pernyataan dari idiot mana pun.
Martin Ba
11
Joel adalah seorang lelaki spreadsheet, bukan seorang lelaki basis data, jadi ketidaktahuannya tentang praktik-praktik basis data relasional standar, saya kira, tidak mengejutkan ... Jangan tersinggung, Joel. :-)
Eric King
3
Kutipan aktual dalam konteks Joel adalah teknologi, seperti LINQ, memberikan alasan untuk repot mengatur kunci asing. Joel bukan seorang administrator basis data dan, dari mencari blognya dan menjadi pembaca lama, saya tidak dapat menemukan apa pun darinya berbicara tentang subjek atau mencoba memberikan saran tentang mengoptimalkan database, merancang model data, dll. Joel mengagumkan , tapi dia tidak sekarang juga belum pernah - atau diklaim sebagai! - seorang ahli di bidang database atau pemodelan data. Ini seperti mengutip Einstein tentang bunga majemuk - atau, dalam hal ini, sandwich. (Referensi XKCD, sama-sama.) :)
BrianH
4
Joel Spolsky dikenal memiliki opini yang kuat dan kontroversial. Lihat FogBugz ditulis dalam bahasa berpemilik ; Injeksi ketergantungan terlalu rumit (btw, ini adalah jawaban paling kontroversial pada Stackoverflow sebelum ditutup) ; Database XML lambat ; dll.
BlueRaja - Danny Pflughoeft
2
@BlueRaja: Umm ... database XML yang lambat, terutama dibandingkan dengan database relasional. Sejak kapan itu kontroversial, atau pendapat?
Mason Wheeler