SQL Database Design आणि Foreign Keys, उदाहरणांसह
CREATE TABLE येणं आणि कोणते tables बनवायचे हे कळणं, या दोन वेगळ्या गोष्टी आहेत. या chapter मध्ये आपण सगळे वापरतात अशा दोन apps, Instagram Reels आणि Flipkart, यांच्या मागचा database design करू, काय column होतं आणि कशाला वेगळा table लागतो ते ठरवू, आणि मग foreign key ने tables सुरक्षितपणे जोडू, म्हणजे कोणतीही order किंवा like अस्तित्वात नसलेल्या user कडे बोट दाखवू शकणार नाही.
या class मध्ये काय शिकणार
CREATE TABLEमध्येच keys लावणं: inlineUNIQUEविरुद्ध comma नंतर table-levelUNIQUE(email)- Duplicate email वर
ERROR 1062, आणि पुढचा id एक number का सोडतो - Database design म्हणजे काय: किती tables, आणि कोणता column कुठे
- Reels table मधले like आणि comment counters का fail होतात, आणि
COUNT(*)सहlikestable - नियम: प्रत्येक row ला अनेक values म्हणजे वेगळा table
- User चा प्रवास चालून tables शोधणं (Flipkart), आणि actions columns का नाहीत
- Foreign keys: orphan rows, parent आणि child,
FOREIGN KEY ... REFERENCES, आणिDESCमधलाMUL - Parent नसलेल्या child साठी
ERROR 1452, children असलेल्या parent साठीERROR 1451 is_activecolumn ने soft delete
1. Practice data
का: खालच्या प्रत्येक command चा result दिलेला आहे. तुम्ही त्याच रिकाम्या database ने सुरुवात केली, तर तुम्हाला तीच उत्तरं मिळतील आणि स्वतः तपासता येईल.
कसं:
mysql -u root -pने login करा.-
नवीन
instagramdatabase ने सुरुवात करा. आधीच्या SQL chapter मधला असेल, तर हे तो काढून टाकतं:DROP DATABASE IF EXISTS instagram; CREATE DATABASE instagram; USE instagram; -
या वेळी आपण table बनवून नंतर दुरुस्त करणार नाही. Keys लगेच लागतात, पुढच्या section मध्ये.
2. Table बनवतानाच keys लावा
का: मागच्या SQL chapter मध्ये आपण keys नंतर ALTER TABLE ने लावल्या. ते चालतं, पण आधीच duplicates आले असतील तर ALTER TABLE fail होतो आणि आधी data साफ करावा लागतो. खऱ्या projects मध्ये पहिली row टाकण्याआधीच keys ठरलेल्या असतात.
Classroom line
Usually we don't create the table first and add the primary key later.
Class मधलं वाक्य
साधारणपणे असं होत नाही की आधी table बनवला आणि नंतर primary key लावली.
Classroom line – हिंदी
"Aisa generally nahi hota ki pehle table banaya fir baad me primary key assign kiya."
काय: CREATE TABLE मध्ये key दोन ठिकाणी लिहिता येते:
- Inline, column वरच:
email VARCHAR(50) UNIQUE. - Table level, सगळ्या columns नंतर वेगळा item म्हणून:
UNIQUE(email). - दोन्हीने अगदी तोच table बनतो. दोन्ही प्रकारे
DESCemailवरUNIदाखवतो. - Table-level प्रकार list मधला अजून एक item आहे, म्हणून प्रत्येक column सारखा त्याच्या आधी comma लागतो.
Classroom line
Declare all the columns first, then declare the unique key at the end with UNIQUE.
Class मधलं वाक्य
आधी सगळे columns declare करा, मग शेवटी UNIQUE वापरून unique declare करा.
Classroom line – हिंदी
"Pehle sabhi columns declare karo, fir last me UNIQUE use karke unique declare karo."
कसं:
-
Table-level प्रकाराने
usersबनवा:CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20), email VARCHAR(50), UNIQUE(email) ); -
DESC users;idलाauto_incrementसहPRI, आणिemailलाUNIदाखवतो. - Inline प्रकार
email VARCHAR(50) UNIQUEअसा असेल, शेवटची ओळ नसेल. तो आत्ता चालवू नका;usersआधीच आहे. UNIQUE(email)च्या आधीचा comma सोडला तर MariaDBERROR 1064 (42000): You have an error in your SQL syntaxदेऊन थांबतो, आणि(email)कडे बोट दाखवतो.- नियम एकापेक्षा जास्त columns वर असेल, किंवा सगळे नियम शेवटी एकत्र ठेवायला आवडत असतील, तर table-level प्रकार वापरा. नाहीतर inline लहान आहे.

Whiteboard: CREATE TABLE users, ज्यात UNIQUE(email) comma नंतर शेवटचा item म्हणून लिहिला आहे. DESC id वर auto_increment सह PRI आणि email वर UNI दाखवतो.
Figure 1. CREATE TABLE मध्ये email UNIQUE करण्याचे दोन मार्ग: column वरच inline, किंवा comma नंतर वेगळी ओळ UNIQUE(email). दोन्हीने तोच table बनतो; duplicate email ERROR 1062 देतो.
3. UNIQUE चं काम: ERROR 1062 आणि सुटलेला id
का: एक email एकाच account चा असला पाहिजे. Login, password reset आणि "हा email आधीच registered आहे" हे सगळं त्यावर अवलंबून आहे.
कसं:
-
एक user टाका. List मध्ये id नाही, म्हणून
AUTO_INCREMENTतो निवडतो:INSERT INTO users (name, email) VALUES ('amit', 'amit@example.com'); -
Query OK, 1 row affected. amit ला id 1 मिळतो. -
तोच email परत टाकून बघा:
INSERT INTO users (name, email) VALUES ('amit', 'amit@example.com'); -
MariaDB नाकारतो:
ERROR 1062 (23000): Duplicate entry 'amit@example.com' for key 'email'. Key ला column चंच नाव मिळतं. -
अजून दोन users टाका:
INSERT INTO users (name, email) VALUES ('neha', 'neha@example.com'); INSERT INTO users (name, email) VALUES ('rahul', 'rahul@example.com'); -
SELECT * FROM users;ids 1, 3, 4 दाखवतो. Fail झालेल्या insert ने id 2 वापरला, मागच्या SQL chapter मध्येAUTO_INCREMENTgaps मध्ये बघितलं तसं.

Whiteboard: तोच email दुसऱ्यांदा टाकणारा insert key 'email' साठी ERROR 1062 ने fail होतो. पुढच्या user ला id 3 मिळतो, कारण fail झालेल्या insert ने id 2 वापरला.
Classroom line
Do it, and try it without looking; see how much you can do on your own.
Class मधलं वाक्य
"Kara, aani na baghta karnyacha prayatna kara, tumhala kiti yeta bagha."
करा, आणि न बघता करण्याचा प्रयत्न करा, तुम्हाला किती येतं ते बघा.
Classroom line
Do it, and try it without looking; see how much you can do on your own.
4. Database design म्हणजे काय
का: App त्याच्या tables इतकंच चांगलं असतं. वाईट design आठवडाभर चालतो आणि मग "ही reel कोणी like केली?" सारख्या साध्या प्रश्नांची उत्तरं देऊ शकत नाही.
काय: database design म्हणजे हे ठरवणं:
- App ला किती tables लागतात.
- कोणते columns कोणत्या table मध्ये जातात.
- Tables एकमेकांशी कसे जोडलेले आहेत.
Classroom line
Deciding how many tables there should be and which column goes in which table is called database design.
Class मधलं वाक्य
किती tables असावेत, कोणत्या table मध्ये कोणता column, यालाच database design म्हणतात.
Classroom line – हिंदी
"Kitne tables hone chahiye, kis table mein kaunsa column, isiko database design bolte hain."
कसं: Design पहिल्या CREATE TABLE च्या आधी होतो, सहसा कागदावर:
- App प्रत्येक screen वर काय दाखवतं ते लिहा.
- Data "गोष्टीं"नुसार गटात टाका: व्यक्ती, reel, like, order.
- प्रत्येक प्रकारची गोष्ट table होते; तिच्याबद्दलची प्रत्येक एकटी माहिती column होते.
- प्रत्येक table साठी एक sample row लिहून बघा आणि प्रत्येक cell तपासा (section 7).
Classroom line
Only when you can separate all this data will you get a proper database design.
Class मधलं वाक्य
जेव्हा तुम्ही हा सगळा data वेगवेगळा करू शकता, तेव्हाच proper database design बनतं.
Classroom line – हिंदी
"Jab aap ye sabhi data alag alag kar paate hain, usi waqt proper database design banega."
5. समजा आपण Instagram Reels बनवतोय
का: Reel ची screen सोपी दिसते: profile photo, username, video, caption, आणि likes व comments चे counts. यातलं प्रत्येक काहीतरी कुठल्यातरी table मधून यायला हवं.
Classroom line
Every reel that gets uploaded must be stored as a record in the database.
Class मधलं वाक्य
जी कोणती reel upload होते, तिचा record database मध्ये store झाला पाहिजे.
Classroom line – हिंदी
"Jo bhi reel upload kar rahe hai, uska record database me store hona chahiye."
काय: बहुतेक लोकांना पहिली कल्पना सुचते ती म्हणजे सगळं काही असलेला एक reels table:
id,user_id(कोणी upload केली),caption,video_url.- आणि counters:
likes,comments,shares, प्रत्येक साधा number.
Classroom line
Let's make the mistakes and see.
Class मधलं वाक्य
"Chuka karun baghuya."
चुका करून बघूया.
Classroom line
Let's make the mistakes and see.
कसं: खऱ्या प्रश्नांनी design तपासा.
- Reel 102 वर
likes = 3. कोणी like दाबलं; app ते 4 करतं. इथपर्यंत ठीक. - कोणी like केलं? Counter सांगू शकत नाही. तो फक्त number आहे.
- कधी like केलं? तेही store नाही.
- एकाच व्यक्तीने दोनदा like केलं का? तपासायला मार्गच नाही.
- कोणी unlike दाबलं. कोणाचं like काढायचं?
- Comments ला हीच अडचण, आणि त्याहून वाईट: comment ला text पण असतो.
Classroom line
If someone has liked it, then who liked it? That should be visible too.
Class मधलं वाक्य
कोणी like केलं असेल, तर कोणी like केलं? तेही दिसलं पाहिजे ना.
Classroom line – हिंदी
"Agar kisi ne like kiya hai to kisne like kiya? Wo bhi dikhna chahiye na."
Figure 2. Animation: reels table मधला likes counter फक्त किती ते सांगतो; कोणी किंवा कधी सांगू शकत नाही, unlike पण सांभाळू शकत नाही. प्रत्येक like ची एक row असलेला likes table या सगळ्यांची उत्तरं देतो, आणि COUNT(*) number देतो.
6. likes table, आणि COUNT(*)
का: Counter "कोणी" किंवा "कधी" सांगू शकला नाही. प्रत्येक like ही स्वतंत्र घटना आहे, म्हणून प्रत्येक like ला स्वतःची row.
Classroom line
Now how will you find out who liked it?
Class मधलं वाक्य
आता तुम्हाला कसं कळणार कोणी like केलं ते?
Classroom line – हिंदी
"Abhi tumhe kaise pata chalega kisne like kiya hai?"
काय: likes table ज्यात:
id: like चा स्वतःचा number.user_id: कोणी like केलं.reel_id: कोणती reel.liked_at: कधी.DEFAULT CURRENT_TIMESTAMPआत्ताची तारीख आणि वेळ आपोआप भरतो.
Likes चा number कुठेच store केला जात नाही. लागेल तेव्हा rows वरून तो मोजला जातो.
कसं:
-
Table बनवा:
CREATE TABLE likes (id INT PRIMARY KEY AUTO_INCREMENT, user_id INT, reel_id INT, liked_at DATETIME DEFAULT CURRENT_TIMESTAMP); -
तीन users reel 102 like करतात, आणि amit reel 105 पण like करतो:
INSERT INTO likes (user_id, reel_id) VALUES (1, 102), (3, 102), (4, 102), (1, 105); -
Query OK, 4 rows affected. प्रत्येक row लाliked_atमध्ये आजची तारीख आणि वेळ मिळाली. -
Reel 102 चे likes
likestable मधून मोजा:SELECT COUNT(*) FROM likes WHERE reel_id = 102; -
उत्तर 3.
-
Count वर tap करा, आणि app कोणी like केलं त्यांची list दाखवतं:
SELECT user_id, liked_at FROM likes WHERE reel_id = 102; -
Users 1, 3 आणि 4 मिळतात, प्रत्येकाची वेळ सोबत. मग app
usersमधून त्यांची नावं आणि profile photos दाखवतं. - Unlike आता सोपं: ती एक row delete करा, उदा.
DELETE FROM likes WHERE user_id = 4 AND reel_id = 102; reelstable मध्ये फक्त reel कडे एकदाच असणारं राहतं: कोणी upload केली, caption, video link.
7. नियम: प्रत्येक row ला अनेक values, वेगळा table
का: कोणत्याही app च्या कोणत्याही column ला लावता येईल अशी झटपट कसोटी हवी.
Classroom line
If a column is going to hold more than one value, that data becomes a separate table.
Class मधलं वाक्य
एखाद्या column मध्ये एकापेक्षा जास्त values येणार असतील, तर तो data वेगळा table बनतो.
Classroom line – हिंदी
"Agar kisi column mein ek se zyada value aane wale hain, toh woh data alag table ban jata hai."
काय:
- प्रत्येक row ला एक value: column म्हणून ठेवा. Reel ला एक caption, एक video link, एक uploader.
- प्रत्येक row ला अनेक values, किंवा वाढत जाणारी list: वेगळा table द्या, प्रत्येक value ची एक row. Reel ला अनेक likes, अनेक comments, अनेक tags.
'1,3,4'सारखी list एका cell मध्ये कधीच भरू नका. त्यातली एक नीट मोजता, शोधता किंवा काढता येत नाही.
कसं: paper test.
- Table चे columns कागदावर लिहा.
- खऱ्यासारख्या values ने एक sample row भरा.
- प्रत्येक cell बघा. त्यात comma ने वेगळी केलेली list लागत असेल, तर त्या data ला वेगळा table हवा.
- उदाहरण:
caption = 'chai time'एक value;liked by = 1, 3, 4, ...अनेक, म्हणूनlikesहा table. - उदाहरण:
tags = chai, rain, puneअनेक, म्हणून tagsreel_tagstable मध्ये: प्रत्येक reel आणि tag ची एक row.
Figure 3. Paper test: एक sample row लिहा आणि प्रत्येक cell तपासा. प्रत्येक row ला एक value column राहते; प्रत्येक row ला अनेक values वेगळा table होतात, प्रत्येक value ची एक row.
8. समजा आपण Flipkart बनवतोय: user चा प्रवास चाला
का: Shopping app मध्ये डझनभर tables असतात. अंदाजाने शोधले तर काही सुटतात; customer सारखं app मधून चाललं तर ते क्रमाने सापडतात.
Classroom line
Whenever you think something through, think step by step.
Class मधलं वाक्य
जेव्हा तुम्ही काही विचार कराल, तेव्हा step by step विचार करायचा.
Classroom line – हिंदी
"Jab bhi aap kuch sochoge na, toh step by step sochna hai."
कसं: एका customer च्या मागे चला आणि प्रत्येक step ला काय store करायचं ते लिहा.
- Register आणि profile:
userstable, प्रत्येक व्यक्तीची एक row. - Delivery address:
addressestable. एका user चे अनेक addresses असू शकतात: तुम्ही Pune मध्ये राहता पण दुसऱ्या शहरातल्या आई-वडिलांना gift पाठवता. एका user ला अनेक values म्हणजे वेगळा table. - Browse:
categories(mobiles, shoes, books) आणिproducts. - Cart आणि wishlist:
cart(user, product, quantity) आणिwishlist(user, product). - Pay:
orders(कोणी घेतलं, किती रुपये) आणिpayments(एका order साठी एक किंवा जास्त). - Order नंतर:
order_tracking(प्रत्येक status बदलाची row),returns,ratings. - पडद्यामागे:
sellers,offers,support_tickets.
Table किंवा column नसलेलं: search, filter, sort, "add to cart", "buy now". या actions आहेत. Action एकतर rows वाचतो (WHERE आणि ORDER BY सह SELECT) किंवा row जोडतो (add to cart म्हणजे cart मध्ये INSERT).
Classroom line
What is add to cart? It is a functionality, an action.
Class मधलं वाक्य
Add to cart काय आहे? Functionality आहे, action आहे.
Classroom line – हिंदी
"Add to cart kya hai? Functionality hai, action hai."
Figure 4. Animation: Flipkart चा user प्रवास (register, profile, browse, cart, address, pay, track) चालल्यावर tables एकेक करून सापडतात. Search, filter आणि add to cart सारख्या actions म्हणजे tables किंवा columns नाहीत.
9. products design: column की वेगळा table?
का: products मध्ये लोक खूप काही भरतात. Section 7 चा नियम प्रत्येक कल्पनेला लावा.
काय:
- Columns, प्रत्येक product ची एक value:
id,name,brand,price DECIMAL(10,2),description,return_days. - Size म्हणजे तीन numbers, म्हणून तीन columns:
length_cm,width_cm,depth_cm. मग प्रत्येकावर filter लावता येतो. - Category: प्रत्येक product row मध्ये "Mobiles" टाइप करू नका.
categoriestable (id,name) ठेवा आणि products मध्ये फक्त number ठेवा:category_id. मग spelling दुरुस्ती एकाच row मध्ये होते. - वेगळे tables, कारण values अनेक आहेत किंवा सतत बदलतात:
product_photos: एका product चे अनेक photos.ratings: एका product ला अनेक users rating देतात.stock: प्रत्येक sale ला बदलतो.price_history: जुन्या किंमती त्यांच्या तारखांसह.sellers: एक product अनेक sellers विकू शकतात.offers: येतात आणि जातात.
- Column अजिबात नाही: "good quality" हे मत आहे; ते
ratingsमध्ये राहतं. "Add to cart" हा action आहे.
Figure 5. products: एकटी माहिती columns राहते, categories table कडे बोट दाखवणारा category_id सुद्धा; photos, ratings, stock, price history, sellers आणि offers यांना वेगळे tables.
10. Foreign keys का: orphan rows
का: आता tables एकमेकांचे ids ठेवतात: likes.user_id, orders.user_id, products.category_id. ते ids खरे आहेत का हे आत्तापर्यंत कोणीच तपासत नाही.
काय बिघडू शकतं:
usersमध्ये ids 1, 3 आणि 4 आहेत.reelsची एक row सांगते reel 103 user 30 ने upload केली. User 30 नाहीच. App कोणाचा profile photo दाखवणार? ही orphan row आहे: parent नसलेला child.ordersची एक row सांगते order 2, Rs 1,00,000, user 10 ने दिली, जो अस्तित्वातच नाही. Audit मध्ये ते पैसे कोणी भरले हे कोणीच सांगू शकत नाही.- अस्तित्वात नसलेल्या users चे likes प्रत्येक like count चुकवतात.
Classroom line
Only the users you actually have will place orders; a user who doesn't exist can't place an order.
Class मधलं वाक्य
जे users तुमच्याकडे आहेत तेच order देतील; जो user अस्तित्वातच नाही तो order देणार नाही.
Classroom line – हिंदी
"Jo user tumhare paas hai wahi order denge; jo user hai hi nahi wo order nahi denge."
काय: foreign key हा एका table च्या column वरचा नियम आहे: "इथली प्रत्येक value त्या दुसऱ्या table च्या त्या column मध्ये असलीच पाहिजे". Database प्रत्येक insert, update आणि delete वर तो तपासतो.
Figure 6. Foreign key शिवाय reel 103 user 30 कडे आणि Rs 1,00,000 ची order 2 user 10 कडे बोट दाखवते, आणि दोन्ही users अस्तित्वात नाहीत: orphan rows.
11. Parent आणि child
का: प्रत्येक foreign key ला दोन बाजू असतात, आणि या chapter मधला प्रत्येक error message त्यातली एक सांगतो. Parent table कोणता हे माहीत असलं की कोणती row दुरुस्त करायची ते कळतं.
काय:
- ज्या table कडे बोट दाखवलं जातं तो parent:
users. - बोट दाखवणारा column ज्या table मध्ये आहे तो child:
orders, त्याच्याuser_idcolumn सह. - एका parent row चे अनेक children असू शकतात: एक user, अनेक orders.
नियम:
- Child च्या foreign key column मधली value parent column मध्ये असलीच पाहिजे. Column
NOT NULLकेला नसेल तरNULLचालतो. - Parent column
PRIMARY KEYकिंवाUNIQUEcolumn असला पाहिजे. सहसा तो parent चा primary key असतो,users(id).users(email)सारखा unique column पण चालतो. - दोन्ही columns चा type सारखा हवा:
INTलाINT. - आधी parent table बनवा. Child त्याला नावाने refer करतो.
कसं: नियम मोडला तर काय होतं ते बघा. ही दोन उदाहरणं फक्त वाचा; ती मुद्दाम fail होतात.
-
Key नसलेला parent column:
CREATE TABLE bad (id INT PRIMARY KEY, uname VARCHAR(20), FOREIGN KEY (uname) REFERENCES users(name)); -
तो fail होतो:
ERROR 1005 (HY000): Can't create table `instagram`.`bad` (errno: 150 "Foreign key constraint is incorrectly formed").nameला key नाही, म्हणून तो parent column होऊ शकत नाही. - Types वेगळे असतील (
INTकडे बोट दाखवणाराVARCHAR), किंवा parent table अजून बनलाच नसेल, तेव्हा पण हाचERROR 1005येतो.
Figure 7. users हा parent आणि orders हा child: प्रत्येक orders.user_id एका users.id कडे बोट दाखवतो. Parent column त्याच type चा PRIMARY KEY किंवा UNIQUE column असला पाहिजे, आणि parent table आधी बनतो.
12. FOREIGN KEY सह CREATE TABLE
का: Foreign key CREATE TABLE मध्येच लिहिला की पहिल्या row पासूनच नियम database मध्ये असतो, म्हणून एकही orphan row आत घुसू शकत नाही.
कसं:
-
Child table बनवा. Foreign key
UNIQUE(email)सारखी table level ला, comma नंतर लिहिली आहे:CREATE TABLE orders ( id INT PRIMARY KEY AUTO_INCREMENT, user_id INT, product_id INT, amount DECIMAL(10,2), FOREIGN KEY (user_id) REFERENCES users(id) ); -
असं वाचा: "या table मधला
user_id,usersमधल्याidला refer करतो". amount DECIMAL(10,2)पैसे अचूक ठेवतो: जास्तीत जास्त 10 अंक, त्यातले 2 दशांश चिन्हानंतर, उदा.1299.50.DESC orders;user_idच्या Key column मध्येMULदाखवतो.- MUL म्हणजे "multiple": column वर index आहे, आणि तीच value परत येऊ शकते. MariaDB प्रत्येक foreign key साठी हा index बनवतो. हे बरोबरच आहे: एका user च्या अनेक orders असू शकतात.
- तुलना:
PRIम्हणजे primary key,UNIम्हणजे unique,MULमध्ये repeat चालतात.

Whiteboard: Foreign key सह बनवल्यानंतर DESC orders: id auto_increment सह PRI आहे, आणि foreign key column MUL दाखवतो.
13. ERROR 1452: child ला parent हवाच
का: Foreign key चा मुख्य उद्देश हाच: अस्तित्वात नसलेल्या user ची order नको.
कसं:
-
rahul (id 4) ची order, जो अस्तित्वात आहे:
INSERT INTO orders (user_id, product_id, amount) VALUES (4, 1001, 499.00); -
Query OK, 1 row affected. तिला id 1 मिळतो. -
User 30 ची Rs 1,00,000 ची order, जो अस्तित्वात नाही:
INSERT INTO orders (user_id, product_id, amount) VALUES (30, 1001, 100000.00); -
MariaDB नाकारतो:
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`instagram`.`orders`, CONSTRAINT `orders_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)). - Message शेवटून वाचा: constraint
orders_ibfk_1सांगतो कीuser_idहाusers.idशी जुळला पाहिजे, आणि 30 जुळत नाही. orders_ibfk_1हे MariaDB ने foreign key ला दिलेलं नाव आहे, कारण आपण नाव दिलं नाही.-
amit (id 1) ची order:
INSERT INTO orders (user_id, product_id, amount) VALUES (1, 1002, 1299.50); -
तिला id 3 मिळतो, 2 नाही. Fail झालेल्या insert ने id 2 वापरला, section 3 मधल्या duplicate email सारखाच.
SELECT * FROM orders;order 1 (user 4, 499.00) आणि order 3 (user 1, 1299.50) दाखवतो.

Whiteboard: अस्तित्वात असलेल्या user ची order चालते; अस्तित्वात नसलेल्या user 30 ची order ERROR 1452 Cannot add or update a child row ने fail होते.
14. ERROR 1451: आधी child delete करा
का: नियम दोन्ही बाजूंनी काम करतो. Children असलेला parent delete केला तर ते children orphan होतील, म्हणून database तेही नाकारतो.
कसं:
-
Order 3 असलेल्या amit ला delete करून बघा:
DELETE FROM users WHERE id = 1; -
MariaDB नाकारतो:
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`instagram`.`orders`, CONSTRAINT `orders_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)). -
आधी child delete करा:
DELETE FROM orders WHERE id = 3; -
आता parent जाऊ शकतो:
DELETE FROM users WHERE id = 1; -
दोन्ही
Query OK, 1 row affectedदेतात.SELECT * FROM users;neha आणि rahul दाखवतो. - हेच संरक्षण parent id बदलण्यावर (
UPDATE users SET id = 33 WHERE id = 4;ERROR 1451देतो) आणि पूर्ण parent table drop करण्यावर पण आहे (ordersrefer करत असेपर्यंतDROP TABLE users;ERROR 1451देतो). - दोन्ही tables काढायचे असतील तर आधी child drop करा:
DROP TABLE orders;मगDROP TABLE users;

Whiteboard: अजून order असलेल्या user चा delete ERROR 1451 ने fail होतो. आधी order delete केल्यावर user चा तोच delete चालतो.
Figure 8. Animation: user 30 ची order ERROR 1452 ने fail होते आणि id 2 वापरते; order 3 बोट दाखवत असताना user 1 चा delete ERROR 1451 ने fail होतो; आधी order, मग user delete केल्यावर चालतं.
15. is_active ने soft delete
का: Customer account बंद करतो. Orders असेपर्यंत user चा delete अडवला जातो, आणि orders delete केल्या तर bills, tax records आणि returns नष्ट होतात. खरी apps अशा rows जवळजवळ कधीच delete करत नाहीत.
Classroom line
Even if a user deactivates their account, we won't have to remove that user.
Class मधलं वाक्य
एखाद्या user ने deactivate केलं तरी, आपल्याला तो user काढावा लागणार नाही.
Classroom line – हिंदी
"Agar koi user deactivate bhi karta hai, to humein ye user nahi nikalna padega."
काय: soft delete मध्ये row ठेवली जाते आणि flag column ने, सहसा is_active, inactive म्हणून mark केली जाते: active साठी 1, deactivate साठी 0. App फक्त active rows दाखवतं.
कसं:
-
Flag जोडा. आधीचे सगळे users active ने सुरू होतात:
ALTER TABLE users ADD COLUMN is_active TINYINT NOT NULL DEFAULT 1; -
rahul (id 4) त्याचं account बंद करतो:
UPDATE users SET is_active = 0 WHERE id = 4; -
App फक्त active users दाखवतं:
SELECT * FROM users WHERE is_active = 1; -
फक्त neha दिसते. rahul ची row अजून आहे, आणि त्याची order 1 पण:
SELECT * FROM orders;ती अजून दाखवतो, खऱ्या user कडे बोट दाखवत. - rahul परत आला?
UPDATE users SET is_active = 1 WHERE id = 4;आणि सगळं पूर्वीसारखं. - App मध्ये users ची list काढणाऱ्या प्रत्येक query ला
WHERE is_active = 1लावायला विसरू नका.
Figure 9. Orders असेपर्यंत hard delete ERROR 1451 ने अडवला जातो, आणि history नष्ट करेल. Soft delete row is_active = 0 सह ठेवतो; app WHERE is_active = 1 ने list काढतं.
Ravindra Bagale's Tip
एकही CREATE TABLE लिहिण्याआधी tables कागदावर काढा, प्रत्येक child column पासून त्याच्या parent पर्यंत बाण काढा, आणि प्रत्येकात एक sample row भरा. Cell ला list लागत असेल तर table बनवा; column मध्ये दुसऱ्या table चा id असेल तर त्याला FOREIGN KEY द्या. Child ला नेहमी parent हवाच असेल, उदा. order चा user_id, तर foreign key column ला NOT NULL लावा. कागदावरची दहा मिनिटं नंतर orphan rows साफ करण्याचे दिवस वाचवतात.
Practice झाल्यावर exit; टाइप करा आणि EC2 instance stop करा.
16. Hands-on lab: keys, foreign key आणि soft delete
हा lab का. Keys म्हणजे database चे स्वतःचे नियम. हा lab प्रत्येक नियम मुद्दाम मोडून बघतो (duplicate email, नसलेल्या user ची order, orders असलेला user delete करणं) आणि खऱ्या apps वापरतात त्या soft delete ने संपतो.
- नवीन database बनवा
- Command:
CREATE DATABASE shop; USE shop; - काय दिसेल:
Query OK, 1 row affected, मगDatabase changed. - Check करा: Prompt मध्ये
[shop]दिसतं. - का: नवीन database म्हणजे तुमचे results या steps शी तंतोतंत जुळतील.
- Command:
- keys सकट users बनवा
- Command:
CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20), email VARCHAR(50) UNIQUE); - काय दिसेल:
Query OK, 0 rows affected - Check करा:
DESC users;मध्येidवरPRIआणिemailवरUNI. - का:
CREATE TABLEमध्ये keys दिल्या की पहिल्या row पासून नियम लागू. नंतर जोडल्या तर आधीच duplicates आले असतील तर fail होतं.
- Command:
- दोन users जोडा
- Command:
INSERT INTO users (name, email) VALUES ('amit', 'amit@example.com'), ('neha', 'neha@example.com'); - काय दिसेल:
Query OK, 2 rows affected - Check करा:
SELECT * FROM users;→ ids 1 आणि 2. - का: ids type केले नाहीत:
AUTO_INCREMENT1 आणि 2 देतो.
- Command:
- Duplicate email करून बघा
- Command:
INSERT INTO users (name, email) VALUES ('amit2', 'amit@example.com'); - काय दिसेल:
ERROR 1062 (23000): Duplicate entry 'amit@example.com' for key 'email' - Check करा:
SELECT COUNT(*) FROM users;→2. - का: एक email एकाच account चा असायला हवा, नाहीतर login आणि password reset बिघडतात.
UNIQUEहे लागू करतो.
- Command:
- foreign key सकट orders बनवा
- Command:
CREATE TABLE orders (id INT PRIMARY KEY AUTO_INCREMENT, user_id INT, amount DECIMAL(10,2), FOREIGN KEY (user_id) REFERENCES users(id)); - काय दिसेल:
Query OK, 0 rows affected - Check करा:
DESC orders;मध्येuser_idवरMUL. - का:
orderschild;usersparent. दोन्ही columnsINT, जे foreign key साठी आवश्यक आहे.
- Command:
- योग्य order जोडा
- Command:
INSERT INTO orders (user_id, amount) VALUES (1, 499.00); - काय दिसेल:
Query OK, 1 row affected - Check करा:
SELECT * FROM orders;→1 | 1 | 499.00. - का: User 1 अस्तित्वात आहे, म्हणून child row ला परवानगी.
- Command:
- नसलेल्या user ची order करून बघा
- Command:
INSERT INTO orders (user_id, amount) VALUES (30, 100.00); - काय दिसेल:
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails ... - Check करा:
SELECT COUNT(*) FROM orders;→1. - का: User 30 नाही, म्हणून user 30 ची order नाही. Foreign key नसता तर ही orphan row ज्याला bill करायचं असा कोणीही नसताना sales data मध्ये बसली असती.
- Command:
- orders असलेला user delete करून बघा
- Command:
DELETE FROM users WHERE id = 1; - काय दिसेल:
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails ... - Check करा:
SELECT name FROM users;मध्ये अजूनamitदिसतो. - का: नियम दोन्ही बाजूंनी चालतो: मुलं असलेला parent orphans मागे सोडून नाहीसा होऊ शकत नाही.
- Command:
- त्याऐवजी soft delete
- Command:
ALTER TABLE users ADD COLUMN is_active TINYINT NOT NULL DEFAULT 1; UPDATE users SET is_active = 0 WHERE id = 1; - काय दिसेल: दोन्हीसाठी
Query OK; update1 row affectedसांगतो. - Check करा:
SELECT name FROM users WHERE is_active = 1;→neha. - का: Account app मधून दिसेनासा होतो, पण bills आणि audits साठी order history राहते. User परत आला तर
is_active = 1करा.
- Command:
- साफ करा
- Command:
DROP DATABASE shop; - काय दिसेल:
Query OK, 2 rows affected(दोन tables काढले). - Check करा:
SHOW DATABASES;मध्ये आताshopनाही. Exit करा आणि instance stop करा. - का: पूर्ण practice database drop केल्याने दोन्ही tables एकाच step मध्ये जातात. खऱ्या data वर हे कधीच चालवू नका.
- Command:
17. पूर्ण class एका page वर
- Keys
CREATE TABLEमध्येच: inlineemail VARCHAR(50) UNIQUE, किंवा comma नंतर table level..., UNIQUE(email). - Duplicate वर
ERROR 1062 ... for key 'email', आणि fail झालेला insert एक id वापरतो. - Database design: किती tables, कोणते columns कुठे, आणि ते कसे जोडलेले.
- Counters कोणी किंवा कधी सांगू शकत नाहीत. प्रत्येक घटनेची एक row (
likes), आणिSELECT COUNT(*) FROM likes WHERE reel_id = 102; - प्रत्येक row ला एक value: column. प्रत्येक row ला अनेक values: वेगळा table.
- User चा प्रवास चालून tables शोधा. Actions (search, filter, add to cart) columns नाहीत.
- Category नावासारखा परत परत येणारा text वेगळा table आणि id column (
category_id) होतो. - Foreign key:
FOREIGN KEY (user_id) REFERENCES users(id). Parent =users, child =orders.DESCMULदाखवतो. - Parent column त्याच type चा
PRIMARY KEYकिंवाUNIQUEcolumn असला पाहिजे; नाहीतरERROR 1005(errno 150). - Parent नसलेला child:
ERROR 1452. Children असलेला parent delete किंवा बदलणं:ERROR 1451. आधी child delete करा. - Soft delete:
is_active1 / 0, आणि app मध्येWHERE is_active = 1.
18. Try at home
Try at home
Task 1: बनवतानाच keys
id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50),sku VARCHAR(20), आणि table-levelUNIQUE(sku)असलेलाproductstable बनवा.- तोच
skuदोनदा टाका आणि error वाचा. मग नवा टाका आणि त्याचा id समजावून सांगा. - नव्या table मध्ये
UNIQUE(sku)च्या आधीचा comma काढा आणि error वाचा.
Task 2: कागदावर design
- Food delivery app चा प्रवास चाला: sign up, restaurant शोधणं, dishes जोडणं, pay, track, rate.
- Tables ची list करा. प्रत्येकासाठी एक sample row लिहा आणि अनेक-values चा नियम लावा.
- दुसऱ्या table चा id ठेवणारा प्रत्येक column mark करा. त्याच तुमच्या foreign keys.
Task 3: foreign keys सह reels
FOREIGN KEY (user_id) REFERENCES users(id)सहreels(id,user_id,caption) बनवा.likesदोन foreign keys सह परत बनवा:user_idतेusers(id)आणिreel_idतेreels(id).- एक reel आणि तीन likes टाका,
COUNT(*)ने मोजा, मग user 30 चं like टाकून बघा.
Task 4: सुरक्षित delete
- Reel असलेल्या user ला delete करून बघा, आणि error वाचा.
- योग्य क्रमाने delete करून ते चालवा.
usersलाis_activeजोडा, एका user ला deactivate करा, आणि फक्त active users ची list काढा.
Recap
थोडक्यात
- Keys
CREATE TABLEमध्येच लावा: column वर inlineUNIQUE, किंवा comma नंतर शेवटचा item म्हणूनUNIQUE(email); duplicate वरERROR 1062. - Database design किती tables, कोणते columns कुठे, आणि tables कसे जोडलेले ते ठरवतो.
- Counter column कोणी किंवा कधी सांगू शकत नाही; प्रत्येक like ची एक row ठेवा आणि
SELECT COUNT(*) FROM likes WHERE reel_id = ...ने मोजा. - प्रत्येक row ला एक value म्हणजे column; प्रत्येक row ला अनेक values म्हणजे वेगळा table, प्रत्येक value ची एक row.
- Tables शोधायला user चा प्रवास चाला; add to cart सारख्या actions columns नाहीत.
- Foreign key orphan rows थांबवतो:
FOREIGN KEY (user_id) REFERENCES users(id); parent columnPRIMARY KEYकिंवाUNIQUEअसला पाहिजे, आणिDESCchild column वरMULदाखवतो. ERROR 1452: child च्या value ला parent नाही.ERROR 1451: parent ला अजून children आहेत, म्हणून आधी child delete करा.- Soft delete history वाचवतो: delete ऐवजी
is_active = 0करा, आणिWHERE is_active = 1ने list काढा.
सराव Tasks
Dublin Fitness Club हा डब्लिन मधला फिटनेस व्यवसाय आहे. Siobhan Murphy त्यांचं IT व cloud काम पाहतात. त्यांचे पैसे EUR मध्ये मोजले जातात आणि AWS resources eu-west-1 Region मध्ये चालतात. खालच्या tasks मध्ये तुम्ही या lesson मध्ये शिकलेलं वापरून त्यांची खरी कामं करता. सगळी नावं, account IDs, IP addresses व numbers सरावासाठी काल्पनिक आहेत.
0 / 10
सोपं मोठ्या orders आधी
का: RDS setup नंतर database query करणं रोजचं काम.
काय करायचं: Order id व amount, मोठी amount आधी.
Tables: customers(id, name, city) व orders(id, customer_id, amount, odate).
- Task कोणत्या table बद्दल आहे ते पाहा (box वरची table list).
- SQL statement step by step लिहा: काय, कुठून, कोणते rows.
- Statement ; ने संपवा.
- Check answer दाबा. Query table च्या practice copy वर चालते.
सोपं City नुसार customers
का: RDS setup नंतर database query करणं रोजचं काम.
काय करायचं: Pune मधल्या customers ची नावं.
Tables: customers(id, name, city) व orders(id, customer_id, amount, odate).
- Task कोणत्या table बद्दल आहे ते पाहा (box वरची table list).
- SQL statement step by step लिहा: काय, कुठून, कोणते rows.
- Statement ; ने संपवा.
- Check answer दाबा. Query table च्या practice copy वर चालते.
सोपं MariaDB मध्ये login करा
का: mysql client ने database server वर SQL चालवता येतं.
काय करायचं: MariaDB client root user म्हणून उघडा व password विचारू द्या.
- हे काम करणारा Linux command शोधा.
- Task ला लागणारे options (उदा. -r, -h) जोडा.
- File नावं, folders किंवा users योग्य क्रमाने लिहा.
- System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.
मध्यम एकूण sales
का: RDS setup नंतर database query करणं रोजचं काम.
काय करायचं: सगळ्या order amounts ची बेरीज.
Tables: customers(id, name, city) व orders(id, customer_id, amount, odate).
- Task कोणत्या table बद्दल आहे ते पाहा (box वरची table list).
- SQL statement step by step लिहा: काय, कुठून, कोणते rows.
- Statement ; ने संपवा.
- Check answer दाबा. Query table च्या practice copy वर चालते.
मध्यम Customer नावांसह orders
का: RDS setup नंतर database query करणं रोजचं काम.
काय करायचं: प्रत्येक customer नाव व order amount.
Tables: customers(id, name, city) व orders(id, customer_id, amount, odate).
- Task कोणत्या table बद्दल आहे ते पाहा (box वरची table list).
- SQL statement step by step लिहा: काय, कुठून, कोणते rows.
- Statement ; ने संपवा.
- Check answer दाबा. Query table च्या practice copy वर चालते.
मध्यम लहान orders काढा
का: RDS setup नंतर database query करणं रोजचं काम.
काय करायचं: 200 पेक्षा कमी amount चे orders delete.
Tables: customers(id, name, city) व orders(id, customer_id, amount, odate).
- Task कोणत्या table बद्दल आहे ते पाहा (box वरची table list).
- SQL statement step by step लिहा: काय, कुठून, कोणते rows.
- Statement ; ने संपवा.
- Check answer दाबा. Query table च्या practice copy वर चालते.
मध्यम City दुरुस्त करा
का: RDS setup नंतर database query करणं रोजचं काम.
काय करायचं: Customer 5 Rome ला गेले. Record update करा.
Tables: customers(id, name, city) व orders(id, customer_id, amount, odate).
- Task कोणत्या table बद्दल आहे ते पाहा (box वरची table list).
- SQL statement step by step लिहा: काय, कुठून, कोणते rows.
- Statement ; ने संपवा.
- Check answer दाबा. Query table च्या practice copy वर चालते.
अवघड Customer नुसार sales
का: RDS setup नंतर database query करणं रोजचं काम.
काय करायचं: Customer नुसार total, फक्त 1000 पेक्षा जास्त.
Tables: customers(id, name, city) व orders(id, customer_id, amount, odate).
- Task कोणत्या table बद्दल आहे ते पाहा (box वरची table list).
- SQL statement step by step लिहा: काय, कुठून, कोणते rows.
- Statement ; ने संपवा.
- Check answer दाबा. Query table च्या practice copy वर चालते.
अवघड Orders नसलेले customers
का: RDS setup नंतर database query करणं रोजचं काम.
काय करायचं: कधीच order न केलेल्या customers ची नावं.
Tables: customers(id, name, city) व orders(id, customer_id, amount, odate).
- Task कोणत्या table बद्दल आहे ते पाहा (box वरची table list).
- SQL statement step by step लिहा: काय, कुठून, कोणते rows.
- Statement ; ने संपवा.
- Check answer दाबा. Query table च्या practice copy वर चालते.
अवघड Database चा file मध्ये backup घ्या
का: mysqldump पूर्ण database SQL म्हणून लिहितो. मोठ्या बदलांआधी save करा.
काय करायचं: dublinfit_wp database root user ने (password विचारून) dublinfit_wp.sql मध्ये dump करा.
- हे काम करणारा Linux command शोधा.
- Task ला लागणारे options (उदा. -r, -h) जोडा.
- File नावं, folders किंवा users योग्य क्रमाने लिहा.
- System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.
उजळणी, तुलना आणि मुलाखत cards
हा lesson काही मिनिटांत revise करा. Cards phone वर save करा किंवा PNG download करा. प्रत्येक card वरचा QR हा lesson उघडतो.








अजून cards: Ravi Sir's Cards.