গ্রাফকিউএল এর পরিবর্তে এসকিউএল ব্যবহার করবেন না কেন?


20

সম্প্রতি আমি গ্রাফকিউএল সম্পর্কে শিখেছি যা বিশ্রামের চেয়ে সেরা বলে দাবি করে। যাইহোক, আমি ভাবতে শুরু করি যে আমরা কেবল এইচটিপিএল অনুরোধের মধ্যে এসকিউএল বিবৃতি রাখি না।

উদাহরণস্বরূপ, গ্রাফকিউএলে আমি লিখতাম would

{
  Movie(id: "cixos5gtq0ogi0126tvekxo27") {
    id
    title
    actors {
      name
    }
  }
}

যা এর এসকিউএল অংশের তুলনায় খুব সহজ নয়

SELECT id, title FROM movies WHERE id = cixos5gtq0ogi0126tvekxo27;
SELECT actors.name FROM actors, actors_movies WHERE actors.id == movies.actor_id AND movie.id == cixos5gtq0ogi0126tvekxo27;

হতে পারে আমরা কোয়েরিটি ইউআরএল-এনকোড করতে এবং সার্ভারে প্রেরণ করতে পারি

GET endpoint?q=SELECT%20id%2C%20title%20FROM%20movies%20WHERE%20id%20%3D%20cixos5gtq0ogi0126tvekxo27%3B%0ASELECT%20actors.name%20FROM%20actors%2C%20actors_movies%20WHERE%20actors.id%20%3D%3D%20movies.actor_id%20AND%20movie.id%20%3D%3D%20cixos5gtq0ogi0126tvekxo27%3B HTTP/1.1

হ্যাঁ, ক্যোয়ারী ইউআরএল খুব দীর্ঘ হতে পারে তবে আপনি যদি আরইএসটি কমপ্লায়েন্স না করে তবে এটি পোস্টের অনুরোধের শৃঙ্খলে রাখতে পারেন। (যাইহোক, আমি মনে করি এইচটিটিপি আরএফসিটি আরইএসটি-র জন্য সংশোধন করা দরকার অর্থে): ক্যোয়ারী স্ট্রিংয়ের দৈর্ঘ্যের ক্যাপিংটি স্পেসিফিকেশনের সাথে একেবারে শুরুতে বাস্তবায়নকে মিশ্রিত করে)

সরাসরি ক্লায়েন্ট থেকে এসকিউএল জারি করার সুবিধাও রয়েছে

  1. উন্নয়নের সময় হ্রাস করে গ্রাফকিউএল পার্স করার জন্য কোনও সার্ভার-সাইড কোড / লাইব্রেরির প্রয়োজন নেই।
  2. রানটাইম হ্রাস করে গ্রাফকিউএল পার্স করার জন্য কোনও সার্ভার-সাইড ওভারহেডের প্রয়োজন নেই।
  3. এসকিউএল স্টেটমেন্টগুলি গ্রাফকিউএল এর চেয়ে অনেক বেশি নমনীয় কারণ (বেশিরভাগ ক্ষেত্রে) পরে এসকিউএল হ্রাস পাবে।
  4. সবাই এসকিউএল জানে।

সুতরাং, গ্রাফকিউএল এর এসকিউএল এর সাথে কী কী সুবিধা রয়েছে?


41
লিটল ববি টেবিল
ফিলিপ কেন্ডল

1
১. আমি এখনও আপনাকে নির্বিচারে জটিল এসকিউএল কোয়েরি করে ডস করতে পারি। ২. কোনও দূষিত অভিনেতা কখনই একটি বৈধ চাবি পাওয়ার সম্ভাবনা নেই ...
ফিলিপ কেন্ডল

3
@ ফিলিপ কেন্ডল আপনি ঠিকই বলেছেন, তবে গ্রাফকিউএল (বা REST বা যাই হোক না কেন) ব্যবহার করা এই সমস্যাগুলি সমাধান করে না, তাই না?
নলজোক

7
@ নলজোক: এসকিউএল হল টিউরিং-সম্পূর্ণ, যার অর্থ এটি স্থিতিশীলভাবে বৈধ হওয়া অসম্ভব।
জার্গ ডব্লু মিত্তাগ

3
এটি কেন ভয়ানক ধারণা তা বুঝতে খুব সহজ। এটি নিজেই প্রয়োগ করুন। এক পর্যায়ে, আপনি বুঝতে পারবেন যে আপনি বেশিরভাগ সময় 1 টি জিনিসটিতে ব্যয় করছেন: সুরক্ষা। খুব শীঘ্রই আপনি কিছুটা বিচলিত বোধ করবেন কারণ আপনি ক্যাপড টোড প্রয়োগ করছেন। তারপরে আপনি বুঝতে পারবেন যে সমস্ত সিস্টেমে সারিগুলি কীভাবে ম্যাপিং করা হচ্ছে এবং আপনি উভয় পক্ষের ক্লায়েন্ট এবং সার্ভারে ORM চাকা পুনরায় উদ্ভাবন করার চেষ্টা করবেন। আপনি হাল ছেড়ে দেওয়ার সময়, আপনার প্রধানমন্ত্রী আপনাকে রিপোর্টের জন্য জিজ্ঞাসা করবেন: ব্যবহারকারীদের পরিষেবা কেমন চলছে ? হয়ে গেছে? "...
লাইভ

উত্তর:


30

মূলত, বিমূর্ততা।

এসকিউএল আপনার ক্লায়েন্টদের আপনার সঠিক ডাটাবেস কাঠামো জানা প্রয়োজন, যা ভাল নয়। সর্বোপরি, ইনপুট হিসাবে প্রেরিত মানের উপর ভিত্তি করে বিশেষ ক্রিয়াকলাপ সম্পাদনের জন্য এসকিউএল বিশ্লেষণ করা সত্যিই একটি কঠিন কাজ। এমন সম্পূর্ণ সফ্টওয়্যার রয়েছে যা কেবলমাত্র তার জন্য বেশ দায়ী। তুমি কি জানো সেগুলি কি? আপনি যদি ডাটাবেসগুলি অনুমান করেন তবে আপনি ঠিক বলেছেন।

সরাসরি এসকিউএল প্রকাশ না করার জন্য আপনাকে ধন্যবাদ, আপনি API এর গ্রাহককে আপনার ডাটাবেসের অভ্যন্তরীণ উপস্থাপনার মধ্যে সীমাবদ্ধ রাখছেন না। আপনি যা প্রকাশ করতে চান কেবল তা সহজেই প্রকাশ করে দিন।

এবং যেহেতু এপিআই-র ক্লায়েন্টগুলি কেবল বিমূর্তনের উপর নির্ভরশীল, তাই আপনি এপিআই ইনপুট এবং প্রকৃত ডাটাবেস (সুরক্ষা, ক্যাশিং, একক অনুরোধে একাধিক ডাটাবেস থেকে ডেটা লোড করা, ...) এর মধ্যে যতটা সম্ভব স্তর রাখতে পারেন।

জনসাধারণের পরিষেবাগুলির জন্য, সরাসরি একটি ডেটাবেস উন্মুক্ত করা ঠিক কখনও সঠিক পদ্ধতির নয়। তবে আপনার যদি কয়েকটি অভ্যন্তরীণ সিস্টেম থাকে তবে নিশ্চিত হয়ে নিন যে আপনার পদ্ধতির অর্থ হতে পারে তবে তবুও অ্যাপ্লিকেশন বি থেকে সরাসরি অ্যাপ্লিকেশন এ এর ​​ডাটাবেসের সাথে সংযোগ করা সহজ হতে পারে অ্যাপ্লিকেশন বিতে ডাটাবেস শংসাপত্রগুলি দিয়ে, আসার চেষ্টা না করে ডাটাবেস এসকিউএল ভাষার জন্য কাস্টম এইচটিটিপি ইন্টারফেস সহ।


আরডিবিএমএসে আসল কোয়েরি করার আগে আমি কেন রেডিসের কীগুলির তুলনায় কেবল ইউআরএল (বা এসকিউএল কোয়েরি) তুলনা করতে পারি না?

কারণ এটি সহজ নয়। এমনকি যদি কেউ খুব সাধারণ প্রশ্নটি ব্যবহার করে তবে:

SELECT st.id, jt.name
FROM some_table st
INNER JOIN join_table jt ON jt.some_table_id = st.id
WHERE st.name = 'hello
world' AND st.type = 'STANDARD'

আপনি কীভাবে নিশ্চিত হন যে ফলাফলটি সঠিকভাবে ক্যাশে হয়েছে? এই ক্যোয়ারিতে নিউলাইনগুলি অন্তর্ভুক্ত রয়েছে তবে কেউ কেউ কোয়েরিটি নিম্নলিখিত উপায়ে লিখতে পারে:

SELECT st.id, jt.name FROM some_table st INNER JOIN join_table jt ON jt.some_table_id = st.id WHERE st.name = 'hello
world' AND st.type = 'STANDARD'

এবং এটি এখনও উপরেরটির মতো একইভাবে ক্যাশে হওয়ার কথা। আমি সুনির্দিষ্টভাবে একটি অন্তর্ভুক্ত করেছি যেখানে স্ট্রিং অনুসন্ধানে একটি নতুন লাইন রয়েছে, সুতরাং কেবল লাইন শেষগুলি সন্ধান করা এবং তাদের স্থানের সাথে প্রতিস্থাপন করা এখানে কাজ করে না, অনুরোধটি সঠিকভাবে বিশ্লেষণ করা আরও জটিল হবে।

আপনি যদি এটি ঠিক করেন তবে, অন্য একটি ক্যোয়ারী শর্তগুলির ক্রমটিকে স্যুইচ করতে পারে এবং ক্যোয়ারীটি দেখতে এইরকম দেখাবে:

SELECT st.id, jt.name
FROM some_table st
INNER JOIN join_table jt ON jt.some_table_id = st.id
WHERE st.type = 'STANDARD' AND st.name = 'hello
world'

এবং অন্য অনুরোধে WHEREএইরকম একটি অনর্থক যুক্তি থাকতে পারে :

SELECT st.id, jt.name
FROM some_table st
INNER JOIN join_table jt ON jt.some_table_id = st.id
WHERE st.type = 'STANDARD' AND st.name = 'hello
world' AND st.stype = 'STANDARD'

এই প্রশ্নের সমস্তগুলি এখনও একই ফলাফল ফেরত পাওয়ার কথা, একইভাবে ক্যাশে করা উচিত। তবে সম্ভাব্য সমস্ত অপশন হ্যান্ডেল করা বেশ অসম্ভব। এজন্য আপনি কেবল রেডিসের কীগুলির সাথে ইউআরএল তুলনা করতে পারবেন না।


এটি একটি দুর্দান্ত উত্তর, তবে দয়া করে আপডেটটি দেখুন।
নলজোক

19

তত্ত্বের কোনও কারণ নেই যে আপনি এটির মতো এসকিউএল ইন্টারফেসটি প্রকাশ করতে পারবেন না।

অনুশীলনে এসকিউএল কার্যকরভাবে যে সিকিউরিটি স্কোপটি আপনি প্রকাশ করতে চান তাতে সীমাবদ্ধ থাকার পক্ষে অনেক বেশি শক্তিশালী।

এমনকি যদি আপনি কেবল পঠনের অ্যাক্সেসের অনুমতি দেন, একটি খারাপ ক্যোয়ারী এখনও সংস্থানগুলিকে হোগ করতে পারে।

গ্রাফকিউএল এর মতো অন্যান্য ভাষা প্রকাশের জন্য ডিজাইন করা হয়েছে। তারা কেবল ব্যবহারকারীদের ইতিমধ্যে যা দেখতে পেয়েছিল তার একটি ফিল্টার বিকল্প দিচ্ছে।

এই ভাষাগুলি ব্যবহারের সুবিধা হ'ল তারা এসকিউএল ব্যবহারকারীদের করা বন্ধ করতে এবং আপনার টেবিল থেকে সরিয়ে নিয়ে যেতে চাইছেন all


2
উত্তরের জন্য ধন্যবাদ, তবে গ্রাফকিউএল কীভাবে রিসোর্স ড্রেনিংয়ের সমস্যা সমাধান করবে তা আপনি ব্যাখ্যা করতে পারেন? একটি দুর্বৃত্ত গ্রাফিক্যুয়াল ক্যোয়ারী এখনও বলতে পারে "প্রতিটি চলচ্চিত্র এবং তাদের অভিনেতাদের সম্পর্কে আমাকে সবকিছু বলুন", ফলে বিশাল গ্রাফ আসে এবং আমার ডিবিএমএস এবং নেটওয়ার্ককে ক্লান্ত করে তোলে।
নলজোক

তবে আমি একটি পুনরাবৃত্ত এসকিউএল কোয়েরি লিখতে পারি যা আপনার টেবিলটিকে লক করে রাখবে এবং অন্য ব্যবহারকারীদের কোনও প্রশ্ন চালানো থেকে বিরত রাখবে
ইওয়ান

4
সমস্যাটি টেবিলগুলিতে অ্যাক্সেসকে সীমাবদ্ধ করা বা মোছার পক্ষে নয়, তবে এসকিউএল এর শিয়ার জটিলতা। আপনি টেম্প টেবিল তৈরি করতে পারবেন? সিএলআই চালানো সম্পর্কে কী? লুপ? লেনদেনের? সাব নির্বাচন? এক্সিকিউটেবল-এর পাথ? এই জিনিসগুলির ব্যবহার যখন গ্রহণযোগ্য হবে এবং এর 'খারাপ' হবে তখন আপনি কীভাবে আলাদা হবেন
ইয়ান

2

অন্যরা যেমন উল্লেখ করেছে, এসপিএলকে সরাসরি এপিআইতে প্রকাশ করা খুব খারাপ বিকল্প। গ্রাফকিউএল, এর নাম থাকা সত্ত্বেও এসকিউএল-এর কোনও বিমূর্ততা নয়, তবে কোনও ডেটা স্টোর বা এমনকি অন্যান্য পরিষেবার জন্য।

আপনি যদি এসকিউএল এর কাছাকাছি থাকা কোনও বিমূর্ততার সন্ধান করছেন, আপনি ওডাটা দেখতে পারেন (যদি আপনি। নেট ব্যাকেন্ডে কাজ করতে পারেন তবে সম্ভবত অন্যান্য বাস্তবায়ন বিদ্যমান)।


0

আপনি যদি গ্রাফকিউএল এর মতো এসকিউএল উন্মোচন করতে চান তবে আপনার গ্রাফকিউএলের মতো কিছু প্রয়োজন হতে পারে, কারণ সুরক্ষার জন্য আপনার গুরুত্বপূর্ণ তথ্যটি লুকিয়ে রাখতে হবে এবং আপনি এপিআইতে কী প্রদর্শন করতে চান তা নির্বাচন করতে হবে।

গ্রাফকিউএল এবং এসকিউএল হ'ল আলাদা জিনিস, এসকিউএল হ'ল ডেটাবেসকে জিজ্ঞাসা করার ভাষা এবং গ্রাফকিউএল কেবলমাত্র এপিআই থেকে ডেটা পরিচালনা করার জন্য, এপিআইতে আপনাকে দেখানোর জন্য আপনার স্কিমার তৈরি করতে হবে এবং এটি পরিচালনা করার জন্য কোয়েরি ইত্যাদি প্রয়োজন etc.

যে কোনও এপিআইতে আপনাকে কেবল সুরক্ষার জন্য সেই জিনিসগুলি তৈরি করতে হবে, তবে আপনি যদি এমন কোনও তথ্য চান যা বিনামূল্যে ডেটা অ্যাক্সেস হতে পারে তবে এটি কার্যকর হবে, আপনি সফ্টওয়্যার জগতের অনেকগুলি বিকল্প জানেন know

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.