ডাটাবেস এবং এসকিউএল সম্পর্কে আমার জ্ঞান বেশিরভাগ বিশ্ববিদ্যালয়ের ক্লাসে ভিত্তিক। যাইহোক, আমি একটি সংস্থায় কয়েকটি সন্ন্যাসী (প্রায় এক বছর) কাটিয়েছি, যেখানে আমি ডাটাবেস নিয়ে কাজ করছিলাম।
আমি কয়েকটি বই পড়া আছে এবং আমি যেমন ডাটাবেস সম্পর্কে কিছু প্রশিক্ষণ অংশগ্রহণ নিয়েছি MySQL
, PostgreSQL
, SQLite
, Oracle
এবং কয়েক nonSQL
db
গুলি যেমন আমাদের MongoDB
, Redis
, ElasticSearch
ইত্যাদি
পাশাপাশি আমি বলেছিলাম, আমি প্রচুর জ্ঞানহীনতার সাথে ভিক্ষুক, কিন্তু আজ কেউ একজন কিছু বলেছিল, যা আমার ভিক্ষুকের জ্ঞানের সম্পূর্ণ বিরোধী।
আমাকে ব্যাখ্যা করতে দাও. আসুন এসকিউএল ডাটাবেস গ্রহণ করি এবং Person
ভিতরে কয়েকটি রেকর্ড সহ সহজ টেবিল তৈরি করি :
id | name | age
-----------------
1 | Alex | 24
2 | Brad | 34
3 | Chris | 29
4 | David | 28
5 | Eric | 18
6 | Fred | 42
7 | Greg | 65
8 | Hubert | 53
9 | Irvin | 17
10 | John | 19
11 | Karl | 23
এখন, এটি অংশ, আমি ফোকাস করতে চাই - id
হয় INDEX
।
এখনও অবধি, আমি ভেবেছিলাম এটি এটি এইভাবে কাজ করে: যখন একটি সারণী তৈরি করা INDEX
হয় তখন খালি থাকে। আমি যখন আমার টেবিলে নতুন রেকর্ড যুক্ত করছি তখন INDEX
কিছু আলগোরিদিদের উপর ভিত্তি করে পুনরায় গণনা করা হচ্ছে। উদাহরণ স্বরূপ:
একে একে দলবদ্ধ করা:
1 ... N
N+1 ... 2N
...
XN+1 ... (X+1)N
সুতরাং, আমার উদাহরণটির সাথে size = 11 elements
এবং N = 3
এটি এর মতো হবে:
id | name | age
-----------------
1 | Alex | 24 // group0
2 | Brad | 34 // group0
3 | Chris | 29 // group0
4 | David | 28 // group1
5 | Eric | 18 // group1
6 | Fred | 42 // group1
7 | Greg | 65 // group2
8 | Hubert | 53 // group2
9 | Irvin | 17 // group2
10 | John | 19 // group3
11 | Karl | 23 // group3
সুতরাং, যখন আমি কোয়েরিটি ব্যবহার করছি SELECT * FROM Person WHERE id = 8
এটি কিছু সাধারণ গণনা করবে 8 / 3 = 2
, সুতরাং আমাদের এই বস্তুর সন্ধান group2
করতে হবে এবং তারপরে এই সারিটি ফিরে আসবে:
8 | Hubert | 53
এই পদ্ধতির সময় O(k)
যেখানে কাজ করে k << size
। অবশ্যই, গ্রুপগুলিতে সারিগুলি সংগঠিত করার জন্য একটি অ্যালগরিটম নিশ্চিতভাবেই অনেক বেশি জটিল তবে আমি মনে করি যে এই সাধারণ উদাহরণটি আমার দৃষ্টিভঙ্গি দেখায়।
সুতরাং এখন, আমি আরেকটি পদ্ধতির উপস্থাপন করতে চাই, যা আমাকে আজ দেখানো হয়েছে।
আবার এই টেবিলটি নেওয়া যাক:
id | name | age
-----------------
1 | Alex | 24
2 | Brad | 34
3 | Chris | 29
4 | David | 28
5 | Eric | 18
6 | Fred | 42
7 | Greg | 65
8 | Hubert | 53
9 | Irvin | 17
10 | John | 19
11 | Karl | 23
এখন, আমরা অনুরূপ কিছু তৈরি করছি Hashmap
(প্রকৃতপক্ষে, এটি একটি হ্যাশ মানচিত্র) যা এই আইডি দিয়ে সারি মানচিত্র id
করে address
। চল বলি:
id | addr
---------
1 | @0001
2 | @0010
3 | @0011
4 | @0100
5 | @0101
6 | @0110
7 | @0111
8 | @1000
9 | @1001
10 | @1010
11 | @1011
সুতরাং এখন, আমি যখন আমার জিজ্ঞাসা চালাচ্ছি: SELECT * FROM Person WHERE id = 8
এটি id = 8
মেমরিতে ঠিকানায় সরাসরি ম্যাপ করবে এবং সারিটি ফিরে আসবে। অবশ্যই এটির জটিলতা O(1)
।
সুতরাং এখন, আমি কিছু প্রশ্ন পেয়েছি।
1. উভয় সমাধানের অ্যাডভেঞ্জেস এবং বিযুক্তি কী?
২. বর্তমান ডাটাবেস বাস্তবায়নে কোনটি বেশি জনপ্রিয়? বিভিন্ন ডিবিএস বিভিন্ন পন্থা ব্যবহার করতে পারে?
৩. এটি কি ননএসকিউএল ডিবিএসে বিদ্যমান?
তুমাকে অগ্রিম ধন্যবাদ
তুলনা
| B-tree | Hash Table
----------------------------------------------------
---------------- one element -------------------
----------------------------------------------------
SEARCHING | O(log(N)) | O(1) -> O(N)
DELETING | O(log(N)) | O(1) -> O(N)
INSERTING | O(log(N)) | O(1) -> O(N)
SPACE | O(N) | O(N)
----------------------------------------------------
---------------- k elements -------------------
----------------------------------------------------
SEARCHING | k + O(log(N)) | k * O(1) -> k * O(N)
DELETING | k + O(log(N)) | k * O(1) -> k * O(N)
INSERTING | k + O(log(N)) | k * O(1) -> k * O(N)
SPACE | O(N) | O(N)
এন - রেকর্ড সংখ্যা
আমি কি সঠিক? প্রতিটি সন্নিবেশ / মুছার পরে বি-গাছ এবং হ্যাশ টেবিলটি পুনর্নির্মাণের ব্যয় সম্পর্কে কী বলা যায় ? বি-ট্রি ক্ষেত্রে আমাদের কিছু পয়েন্টার পরিবর্তন করতে হবে তবে ভারসাম্যপূর্ণ বি-ট্রি ক্ষেত্রে এর জন্য আরও বেশি প্রচেষ্টা প্রয়োজন। এছাড়াও হ্যাশ টেবিলের ক্ষেত্রে আমাদের কয়েকটি অপারেশন করতে হবে, বিশেষত, যদি আমাদের অপারেশন দ্বন্দ্ব সৃষ্টি করে ।
Of course, an alghoritm to organise rows in groups is for sure much more complicated but I think this simple example shows my point of view.
অবশ্যই, আমি জানি এটি অনেক বেশি জটিল। সুতরাং অবশেষে, যখন আমি আমার কোডটিতে বলছি INDEX
আমার সমাধানগুলির কোনটি ( প্রথম বা দ্বিতীয় ) এই বাস্তবটির সাথে আরও নিকটে? এবং সময়ের উপর নির্ভর করে একটি রেকর্ড অ্যাক্সেস করতে প্রয়োজন INDEX
। আসলেই কি তাই O(1)
? বি-ট্রি ইনডেক্সের সাথে এটির মতো শোনাচ্ছে O(log2(N))
। আমি কি সঠিক?
O(1)
আপনার সম্পর্কে অংশটি ঠিক আছে! প্রথম উপায়ে, দেখে মনে হচ্ছে আপনি একটি বি-ট্রি সূচক বর্ণনা করছেন তবে আপনার কিছু ভুল ধারণা রয়েছে। কোনও গণনা নেই (3 বা কোনও কিছু দ্বারা বিভাজন), গাছটি আরও