অধ্যায় 1 · ডেটাবেস ও SQL
ডেটা, ডেটাবেস ও SQL: AI ইঞ্জিনিয়ারের কেন দরকার
- পৃষ্ঠা 1 / 22
- 12 মিনিট পড়া
আপনি যত AI সিস্টেম বানাবেন, প্রায় সবগুলোর নিচেই থাকবে একটা ডেটাবেস। কাস্টমার চলে যাবে কি না (churn) — এমন মডেলের ট্রেনিং ডেটা আসে অর্ডারের টেবিল থেকে। যে চ্যাটবট ডিপ্লয় করবেন, সেটা প্রতিটা প্রম্পট, উত্তর, টোকেন সংখ্যা আর খরচ একটা টেবিলে লগ করে, যাতে কেউ দেখতে পারে সেটা ভালো হচ্ছে না খারাপ। একটা RAG অ্যাপ্লিকেশন তার ডকুমেন্টের টুকরো (chunk), সেগুলোর উৎস আর কে কোনটা দেখতে পারবে — সব টেবিলে রাখে, অনেক সময় এমবেডিংও। এদের সবার ভাষা একটাই: SQL।
এই টিউটোরিয়াল একদম শূন্য থেকে SQL শেখায়, BitByte Shop নামের একটা ছোট অনলাইন দোকানের ডেটা দিয়ে। এই প্রথম পাতায় দেখবেন ডেটাবেস কী, AI-এর কাজে SQL শেখা কেন লাভজনক, রিলেশনাল ডেটাবেস অন্য যেসব ডেটাবেসের নাম শুনবেন সেগুলোর থেকে কোথায় আলাদা, আর আমরা SQL-এর কোন রূপটা ব্যবহার করব।
যা শিখবেন
- ডেটা, ডেটাবেস, DBMS আর RDBMS কী, আর SQL কী
- AI, ML আর ডেটা সায়েন্সে SQL কেন রোজকার হাতিয়ার
- রিলেশনাল ডেটাবেস ডকুমেন্ট, কি-ভ্যালু, গ্রাফ আর ভেক্টর ডেটাবেস থেকে কোথায় আলাদা
- প্রধান SQL ডায়ালেক্ট (SQLite, MySQL, PostgreSQL, SQL Server), আর এই কোর্সে কোনগুলো ব্যবহার হবে
ডেটা, ডেটাবেস আর DBMS
পাঁচটা শব্দ বারবার আসবে। একবারেই এগুলো পরিষ্কার করে নেওয়া ভালো:
| শব্দ | মানে | BitByte Shop-এ উদাহরণ |
|---|---|---|
| ডেটা | লিখে রাখা তথ্য | "নাদিয়া রহমান ১২ জানুয়ারি ২০২৬-এ একটা Python বই অর্ডার করেছেন" |
| ডেটাবেস | গোছানো, স্থায়ীভাবে রাখা ডেটার সংগ্রহ | দোকানের সব কাস্টমার, প্রোডাক্ট, অর্ডার আর পেমেন্ট |
| DBMS (ডেটাবেস ম্যানেজমেন্ট সিস্টেম) | যে সফটওয়্যার ডেটাবেসটা রাখে আর অনেক প্রোগ্রামকে নিরাপদে সেটা পড়তে ও বদলাতে দেয় | SQLite, MySQL, PostgreSQL |
| RDBMS (রিলেশনাল DBMS) | যে DBMS ডেটা রাখে সারি আর কলামের টেবিলে, আর টেবিলগুলোকে কি দিয়ে একে অপরের সাথে যুক্ত করে | customer_id দিয়ে যুক্ত একটা customers টেবিল আর একটা orders টেবিল |
| SQL (Structured Query Language) | RDBMS-কে প্রশ্ন করা আর তার ডেটা বদলানোর প্রচলিত (standard) ভাষা | SELECT name FROM customers; |
AI-এর জন্য Python-এ যেমন করেছিলেন, সবকিছু CSV বা Excel ফাইলে রাখলে সমস্যা কী? একবারের একটা বিশ্লেষণের জন্য ফাইলই যথেষ্ট। কিন্তু DBMS এমন কিছু দেয়, যা ফাইল দিতে পারে না: একই মুহূর্তে অনেক ব্যবহারকারী আর প্রোগ্রাম পড়ছে-লিখছে, অথচ কিছু নষ্ট হচ্ছে না; এমন নিয়ম যা ভুল ডেটা ঢুকতেই দেয় না (যে কাস্টমার নেই তার অর্ডার নয়, ঋণাত্মক দাম নয়); ইনডেক্স, যা লক্ষ লক্ষ সারির মধ্যে একটা সারি দ্রুত খুঁজে দেয়; আর ট্রানজ্যাকশন, যাতে একটা পেমেন্ট হয় পুরোটা লেখা হয়, নয়তো একদমই না।
এক নজরে SQL
SQL হলো ডিক্লারেটিভ (declarative): আপনি বলেন কোন ফলাফল চান, আর কীভাবে সেটা বের করতে হবে তা ডেটাবেস নিজেই ঠিক করে। দোকানের মালিক হয়তো জানতে চাইবেন, "কোন প্রোডাক্টগুলো সবচেয়ে বেশি ইউনিট বিক্রি হয়েছে?" সিনট্যাক্স নিয়ে এখন চিন্তা করবেন না; জয়েন: INNER JOIN আর টেবিল অ্যালিয়াস পাতায় পৌঁছাতে পৌঁছাতে এমন কোয়েরি নিজেই লিখতে পারবেন:
SELECT p.name, SUM(oi.quantity) AS units_sold
FROM order_items AS oi
JOIN products AS p ON p.product_id = oi.product_id
GROUP BY p.name
ORDER BY units_sold DESC, p.name
LIMIT 5;+-------------------------+------------+
| name | units_sold |
+-------------------------+------------+
| Wireless Mouse | 5 |
| Laptop Stand | 3 |
| Python Crash Course | 3 |
| 27-inch Monitor | 2 |
| AI Engineering Bootcamp | 2 |
+-------------------------+------------+প্রায় ইংরেজি বাক্যের মতোই পড়া যায়: অর্ডারের আইটেমগুলো নেওয়া, প্রতিটার সাথে প্রোডাক্টের নাম জোড়া, প্রোডাক্ট ধরে সারিগুলো দলে ভাগ করা, পরিমাণগুলো যোগ করা, বেশি থেকে কম ক্রমে সাজানো, আর প্রথম পাঁচটা রাখা। কীভাবে লুপ চালাতে হবে, সাজাতে হবে বা গুনতে হবে — তা আপনি একবারও বলেননি। একই উত্তর সাধারণ Python-এ লিখলে দেখুন:
import sqlite3
con = sqlite3.connect("shop.db")
names = dict(con.execute("SELECT product_id, name FROM products"))
units = {}
for product_id, quantity in con.execute("SELECT product_id, quantity FROM order_items"):
name = names[product_id]
units[name] = units.get(name, 0) + quantity
top = sorted(units.items(), key=lambda item: (-item[1], item[0]))[:5]
for name, total in top:
print(f"{name:26} {total}")Wireless Mouse 5
Laptop Stand 3
Python Crash Course 3
27-inch Monitor 2
AI Engineering Bootcamp 2উত্তর একই, কিন্তু প্রতিটা সারি Python-এ টেনে আনতে হলো, লুপ আর সাজানো নিজে লিখতে হলো, আর পাঁচ কোটি সারির টেবিল হলে মেমোরিও ফুরিয়ে যেত। SQL-এর সংস্করণটা চলে ডেটাবেসের ভেতরে, ডেটার পাশেই, আর ফেরত আসে মাত্র পাঁচটা সারি। এই অভ্যাসটাই গড়ে তুলুন: বাছাই, জোড়া লাগানো আর গোনার কাজ ডেটাবেসকে করতে দিন; Python-এ আনুন শুধু ফলাফল।
AI ইঞ্জিনিয়ারের SQL কেন লাগে
| কাজ | SQL কোথায় আসে |
|---|---|
| ট্রেনিং ডেটা | মডেল যে সারিগুলো থেকে শেখে, সেগুলো সাধারণত একটা কোয়েরি দিয়েই তোলা হয়: "জুনের আগে যোগ দেওয়া প্রত্যেক কাস্টমার, তাঁদের অর্ডারসহ"। |
| ফিচার বের করা | কাস্টমারপ্রতি গণনা, মোট আর গড় (গত ৯০ দিনে অর্ডার, গড় বাস্কেট) — এগুলো GROUP BY কোয়েরি। |
| লগ আর ইভ্যালুয়েশন | LLM অ্যাপ প্রতিটা কল লগ করে (প্রম্পট, মডেল, টোকেন, ল্যাটেন্সি, খরচ, ব্যবহারকারীর রেটিং)। "এই সপ্তাহে কোন প্রম্পট সংস্করণের রেটিং সবচেয়ে ভালো?" — এটা একটা SQL প্রশ্ন। |
| RAG মেটাডেটা | ডকুমেন্টের প্রতিটা টুকরোর সাথে থাকে উৎস, তারিখ, ভাষা আর কে পড়তে পারবে। সিমিলারিটি সার্চের আগে বা সাথে এগুলো দিয়ে বাছাই করা সাধারণ SQL। |
| ভেক্টর সার্চ | pgvector এক্সটেনশন দিয়ে PostgreSQL এমবেডিং রাখে আর সবচেয়ে কাছেরগুলো খুঁজে দেয় — আপনার ফিল্টারগুলোর সাথে একই কোয়েরিতে। |
| অ্যানালিটিক্স আর ড্যাশবোর্ড | প্রোডাক্ট, বিজনেস আর ডেটা টিম বেশিরভাগ প্রশ্নের উত্তর SQL দিয়েই বের করে, আর ডেটা ওয়্যারহাউসও (BigQuery, Snowflake, Redshift) SQL-এই কথা বলে। |
শেষের আগের সারিটা এবার সত্যি সত্যি দেখুন: প্রোডাক্টের হেল্প-টেক্সটের একটা ছোট টেবিল, প্রতিটার সাথে ৩টা সংখ্যার "এমবেডিং" (আসল এমবেডিংয়ে শত শত বা হাজার হাজার সংখ্যা থাকে)। একটা প্রশ্নের সবচেয়ে কাছের লেখাটা খোঁজা হচ্ছে — প্রথমে শুধু মিলের ভিত্তিতে, তারপর শুধু স্টকে থাকা প্রোডাক্টের মধ্যে। প্রথম লাইনের -- PostgreSQL মানে এই ব্লকটা SQLite-এ নয়, একটা PostgreSQL সার্ভারে চলেছে:
-- PostgreSQL
CREATE EXTENSION IF NOT EXISTS vector;
CREATE TABLE help_chunks (
chunk_id INTEGER PRIMARY KEY,
product_id INTEGER NOT NULL,
body TEXT NOT NULL,
embedding vector(3) NOT NULL,
FOREIGN KEY (product_id) REFERENCES products (product_id)
);
INSERT INTO help_chunks VALUES
(1, 3, 'Keyboard: how to change the keycaps', '[0.9, 0.1, 0.0]'),
(2, 4, 'Mouse: pairing over Bluetooth', '[0.2, 0.9, 0.1]'),
(3, 9, 'USB-C hub: connecting two monitors', '[0.1, 0.3, 0.9]'),
(4, 5, 'Monitor: choosing the right refresh rate', '[0.3, 0.1, 0.8]');
-- "দুটো স্ক্রিন কীভাবে ব্যবহার করব?" প্রশ্নের এমবেডিং [0.1, 0.3, 0.9]
-- 1) শুধু মিলের ভিত্তিতে
SELECT c.body,
p.stock,
ROUND((c.embedding <=> '[0.1, 0.3, 0.9]')::numeric, 3) AS distance
FROM help_chunks AS c
JOIN products AS p ON p.product_id = c.product_id
ORDER BY distance
LIMIT 2;
-- 2) মিল, সাথে একটা ব্যবসার নিয়ম: শুধু স্টকে থাকা প্রোডাক্ট
SELECT c.body,
p.stock,
ROUND((c.embedding <=> '[0.1, 0.3, 0.9]')::numeric, 3) AS distance
FROM help_chunks AS c
JOIN products AS p ON p.product_id = c.product_id
WHERE p.stock > 0
ORDER BY distance
LIMIT 2;+------------------------------------------+-------+----------+
| body | stock | distance |
+------------------------------------------+-------+----------+
| USB-C hub: connecting two monitors | 0 | 0.000 |
| Monitor: choosing the right refresh rate | 5 | 0.049 |
+------------------------------------------+-------+----------+
+------------------------------------------+-------+----------+
| body | stock | distance |
+------------------------------------------+-------+----------+
| Monitor: choosing the right refresh rate | 5 | 0.049 |
| Mouse: pairing over Bluetooth | 60 | 0.570 |
+------------------------------------------+-------+----------+<=> হলো pgvector-এর কোসাইন ডিসট্যান্স (0 মানে "একই দিকে তাক করা"; কোসাইন সিমিলারিটি আছে AI-এর জন্য গণিত-এ)। শুধু মিল দেখলে USB-C হাবের লেখাটাই জেতে, কিন্তু প্রোডাক্ট ৯-এর stock = 0, তাই দ্বিতীয় কোয়েরিতে WHERE ফিল্টার সেটাকে বাদ দিয়েছে আর মনিটরের লেখাটা প্রথমে এসেছে। ব্যবসার নিয়ম আর সিমিলারিটি সার্চ, একই কোয়েরিতে। অ্যাডভান্সড টিউটোরিয়ালে ঠিক এটাই বানাবেন।
রিলেশনাল আর নন-রিলেশনাল ডেটাবেস
রিলেশনাল ডেটাবেসই একমাত্র ধরন নয়। বাকিগুলোকে একসাথে বলা হয় "NoSQL"; প্রতিটা বানানো হয়েছে ডেটার একটা নির্দিষ্ট গড়নের জন্য:
| ধরন | ডেটা রাখে যেভাবে | উদাহরণ | যেখানে ভালো | AI-তে উদাহরণ |
|---|---|---|---|---|
| রিলেশনাল | নির্দিষ্ট কলামের টেবিল, কি দিয়ে যুক্ত | PostgreSQL, MySQL, SQLite, SQL Server | সামঞ্জস্যপূর্ণ ব্যবসার ডেটা, জয়েন, রিপোর্ট | ইউজার, অর্ডার, LLM কলের লগ, ইভ্যালুয়েশনের ফলাফল |
| ডকুমেন্ট | JSON-এর মতো ডকুমেন্ট, প্রতিটার গড়ন আলাদা হতে পারে | MongoDB, Firestore | যে ডেটার ফিল্ড রেকর্ডভেদে বদলায় | API-র কাঁচা রেসপন্স, চ্যাটের ট্রান্সক্রিপ্ট |
| কি-ভ্যালু | একটা কি আর তার মান, যেন বিশাল একটা Python dict | Redis, DynamoDB | কি দিয়ে খুব দ্রুত খোঁজা, ক্যাশ, সেশন | একই প্রম্পটের LLM উত্তর ক্যাশ করা |
| গ্রাফ | নোড আর তাদের মধ্যের সংযোগ (edge) | Neo4j | সংযোগ নিয়ে প্রশ্ন ("বন্ধুর বন্ধু") | নলেজ গ্রাফ, প্রতারক চক্র ধরা |
| ভেক্টর | এমবেডিং আর মেটাডেটা | Pinecone, Qdrant, Milvus, Weaviate; PostgreSQL-এর ভেতরে pgvector | "সবচেয়ে কাছাকাছি জিনিসগুলো খুঁজে বের করা" | সিমান্টিক সার্চ, RAG রিট্রিভাল |
সোজা কথা: বেশিরভাগ বাস্তব AI প্রোডাক্ট তাদের মূল ডেটা রাখে একটা রিলেশনাল ডেটাবেসে, আর বিশেষ ধরনের স্টোর যোগ করে কেবল যখন সত্যিই দরকার হয়। অনেক টিম PostgreSQL আর pgvector দিয়ে শুরু করে, আলাদা ভেক্টর ডেটাবেস আর কখনো লাগেই না। আর সীমারেখাটাও ক্রমে ঝাপসা হচ্ছে — PostgreSQL আর MySQL JSON ডকুমেন্ট রাখতে পারে, SQLite-ও পারে।
SQL-এর ডায়ালেক্ট, আর এই কোর্সে কোনগুলো
SQL একটা ISO স্ট্যান্ডার্ড, কিন্তু প্রতিটা ডেটাবেস নিজের ডায়ালেক্ট-এ (উপভাষায়) কথা বলে: মূল অংশ (SELECT, WHERE, JOIN, GROUP BY) সব জায়গায় একই, কিন্তু টেক্সট ফাংশন, তারিখ নিয়ে কাজ বা কয়টা সারি ফেরত আসবে তা বেঁধে দেওয়ার মতো খুঁটিনাটি আলাদা।
| ডায়ালেক্ট | কীভাবে চলে | কোথায় দেখা পাবেন |
|---|---|---|
| SQLite | আপনার প্রোগ্রামের ভেতরের একটা লাইব্রেরি; পুরো ডেটাবেস একটা ফাইল। সার্ভার নেই, পাসওয়ার্ড নেই। | মোবাইল, ব্রাউজার, ডেস্কটপ অ্যাপ, প্রোটোটাইপ, টেস্ট — আর Python-এর ভেতরেই আছে |
| MySQL (আর MariaDB) | একটা সার্ভার, যার সাথে নেটওয়ার্কে সংযোগ করেন | ওয়েব অ্যাপ্লিকেশন, WordPress, অনেক স্টার্টআপ |
| PostgreSQL | একটা সার্ভার, যার সাথে নেটওয়ার্কে সংযোগ করেন | আধুনিক ব্যাকএন্ড, অ্যানালিটিক্স, AI অ্যাপ (pgvector) |
| SQL Server (T-SQL) | Microsoft-এর সার্ভার | ব্যাংক, বড় প্রতিষ্ঠান, Microsoft-নির্ভর কোম্পানি |
এই কোর্সে অনুশীলন হবে SQLite-এ, কারণ Python ছাড়া আর কিছু লাগে না, আর পুরো ডেটাবেসটা একটা ফাইল, যা এক সেকেন্ডে মুছে আবার বানানো যায়। যেখানে MySQL বা PostgreSQL অন্যভাবে আচরণ করে, পাতাটা সেটা আসল সার্ভারে চালিয়ে দেখায়, এমন ব্লকে যার প্রথম লাইন -- MySQL বা -- PostgreSQL। কেন এটা গুরুত্বপূর্ণ, তার প্রথম স্বাদ — একই প্রশ্ন তিনটা ডেটাবেসে:
SELECT 7 / 2 AS result;+--------+
| result |
+--------+
| 3 |
+--------+-- MySQL
SELECT 7 / 2 AS result;+--------+
| result |
+--------+
| 3.5000 |
+--------+-- PostgreSQL
SELECT 7 / 2 AS result;+--------+
| result |
+--------+
| 3 |
+--------+SQLite আর PostgreSQL দুটো পূর্ণসংখ্যা ভাগ করে ভাগশেষ ফেলে দেয়; MySQL দেয় দশমিক সংখ্যা। ভাবুন, এভাবে একটা "বাতিল হওয়া অর্ডারের অনুপাত" ফিচার হিসাব করলেন, আর এক ডেটাবেসে প্রত্যেক কাস্টমারের জন্য পেলেন 0, অন্যটায় ঠিক সংখ্যা। এমন পার্থক্য হাতেগোনা, কিন্তু চুপচাপ বাগ তৈরি করে ঠিক এগুলোই, তাই এই কোর্স সেগুলো দেখিয়ে দেয়।
সাধারণ ভুল
- গুনতে বা বাছতে পুরো টেবিল Python-এ লোড করা। এটা ধীর, মেমোরি নষ্ট করে, আর বড় টেবিলে ভেঙে পড়ে। বরং ডেটাবেসকে জিজ্ঞেস করুন, ফেরত আনুন শুধু উত্তরটা:
SELECT COUNT(*) AS delivered FROM orders WHERE status = 'delivered';+-----------+ | delivered | +-----------+ | 11 | +-----------+ - ধরে নেওয়া যে সব ডেটাবেস একই উত্তর দেবে। দেখলেন তো, SQLite আর PostgreSQL-এ
7 / 2হলো 3। ভগ্নাংশ চাইলে একটা সংখ্যাকে দশমিক করে দিন:SELECT 7 / 2.0 AS result;+--------+ | result | +--------+ | 3.5 | +--------+ - ধরে নেওয়া যে সারিগুলো একটা নির্দিষ্ট ক্রমে আসবে। টেবিলের নিজস্ব কোনো ক্রম নেই;
ORDER BYনা দিলে ডেটাবেস যেকোনো ক্রমে সারি দিতে পারে, আর সেই ক্রম বদলেও যেতে পারে। এই কোর্সে একাধিক সারি ফেরত দেওয়া প্রতিটা কোয়েরি বলে দেয় কীভাবে সাজাতে হবে:SELECT name FROM customers ORDER BY name LIMIT 3;+---------------+ | name | +---------------+ | Farhana Akter | | Imran Hossain | | Karim Uddin | +---------------+ - ট্রেন্ডে আছে বলে ডেটাবেস বেছে নেওয়া। শুধু একটা ভেক্টর ডেটাবেস "প্রতিটা টুকরো কোনো আসল ডকুমেন্টের অংশ" — এমন নিয়ম জোর করে মানাতে পারে না, টুকরোগুলোকে ইউজার আর পারমিশনের সাথে জয়েনও করতে পারে না। শুরু করুন আপনার ডেটার গড়ন আর প্রশ্নগুলো থেকে; বেশিরভাগ প্রজেক্টে এর মানে আগে একটা রিলেশনাল ডেটাবেস, ঠিক ওপরের pgvector উদাহরণের মতো।
নিজে চেষ্টা করুন
- সহজ: কোন প্রয়োজনে কোন ধরনের ডেটাবেস সবচেয়ে মানানসই? (ক) দোকানের অর্ডার আর পেমেন্ট, (খ) একটা প্রম্পটের উত্তর দশ মিনিটের জন্য ক্যাশ করা, (গ) একটা প্রশ্নের সাথে অর্থে মেলে এমন হেল্প-আর্টিকেল খোঁজা, (ঘ) এমন API-র কাঁচা JSON রেসপন্স রাখা, যার ফিল্ড প্রায়ই বদলায়।
- মাঝারি: এই পাতার প্রথম কোয়েরিটা বদলে শুধু সেরা ৩টা প্রোডাক্ট দেখান। তারপর চালানোর আগে অনুমান করুন, SQLite-এ
SELECT 9 / 4, 9 / 4.0;কী দেবে। - কঠিন: Python-এ,
GROUP BYছাড়া, প্রতিটা স্ট্যাটাসের কতটা অর্ডার আছে গুনুন (SELECT status FROM orders-এর ওপর লুপ চালিয়ে)। তারপর একটাই SQL কোয়েরি দিয়ে একই গণনা বের করে মিলিয়ে দেখুন।
উত্তর
১. (ক) রিলেশনাল, (খ) কি-ভ্যালু (যেমন Redis), (গ) ভেক্টর সার্চ (একটা ভেক্টর ডেটাবেস, বা PostgreSQL-এ pgvector), (ঘ) ডকুমেন্ট — অথবা রিলেশনাল টেবিলে একটা JSON কলাম।
২. LIMIT 5-এর জায়গায় LIMIT 3 লিখুন। 9 / 4 হলো 2 (পূর্ণসংখ্যার ভাগ), আর 9 / 4.0 হলো 2.25:
SELECT p.name, SUM(oi.quantity) AS units_sold
FROM order_items AS oi
JOIN products AS p ON p.product_id = oi.product_id
GROUP BY p.name
ORDER BY units_sold DESC, p.name
LIMIT 3;
SELECT 9 / 4, 9 / 4.0;৩. Python লুপ আর SQL কোয়েরি একই গণনা দেয়:
import sqlite3
con = sqlite3.connect("shop.db")
counts = {}
for (status,) in con.execute("SELECT status FROM orders"):
counts[status] = counts.get(status, 0) + 1
for status in sorted(counts):
print(status, counts[status])SELECT status, COUNT(*) AS orders
FROM orders
GROUP BY status
ORDER BY status;সারসংক্ষেপ
- ডেটাবেস হলো গোছানো, স্থায়ী ডেটার সংগ্রহ; DBMS হলো যে সফটওয়্যার সেটা সামলায়; RDBMS সেটা রাখে পরস্পর যুক্ত টেবিলে।
- SQL ডিক্লারেটিভ: আপনি ফলাফলের বর্ণনা দেন, পথ খোঁজে ডেটাবেস। বাছাই আর গোনা তাকেই করতে দিন, Python-এ আনুন শুধু ফলাফল।
- AI-এর কাজে SQL দিয়ে ট্রেনিং ডেটা আর ফিচার বানানো হয়, LLM লগ আর ইভ্যালুয়েশন বিশ্লেষণ করা হয়, RAG মেটাডেটা ফিল্টার করা হয়, আর pgvector দিয়ে ভেক্টর সার্চও চলে।
- ডকুমেন্ট, কি-ভ্যালু, গ্রাফ আর ভেক্টর ডেটাবেস প্রতিটা ডেটার একেকটা গড়নের জন্য; বেশিরভাগ সিস্টেমের কেন্দ্রে থাকে একটা রিলেশনাল ডেটাবেস।
- এই কোর্স অনুশীলন করে SQLite-এ, আর যেখানে MySQL ও PostgreSQL আলাদা, সেখানে সেগুলো দেখায় (
7 / 2ইতিমধ্যেই দেখিয়েছে)।
এরপর: টেবিল, কি আর রিলেশনশিপ পাতায় BitByte Shop ডেটাবেসটা খুলে দেখবেন এর টেবিলগুলো কীভাবে বানানো, আর প্রাইমারি ও ফরেন কি দিয়ে কীভাবে যুক্ত — এই ধারণাটাই এই পাতার প্রথম কোয়েরির মতো কোয়েরি সম্ভব করে।