एक बहुत देर से उत्तर, लेकिन जो कोई सोच रहा है और गुगल कर रहा है उसके लिए।
हां यह किया जा सकता है, लेकिन यह नहीं है अच्छा अभ्यास और हालांकि यह काफी सरल है, यह संभवत:आपके चेहरे पर खिल जाएगा यदि आप इस बारे में बहुत जागरूक नहीं हैं कि आप क्या कर रहे हैं। अनुशंसित नहीं है।
हालाँकि, मैं उपयोग देख सकता हूँ। उदाहरण के लिए, आपके पास लाखों रिकॉर्ड की एक बड़ी तालिका है, और आप असाधारण मामलों में अज्ञात या एकाधिक तालिकाओं से लिंक करना चाहते हैं (इस मामले में यह बेहतर होगा कई ) एकाधिक तालिकाओं के साथ, यदि आप उन सभी के लिए एक विदेशी कुंजी बनाते हैं, तो यह आपके डेटाबेस आकार में एक बड़ी ब्लोट होगी। उदाहरण के लिए एक तकनीकी सहायता प्रणाली में एक अज्ञात तालिका संभव होगी, जहां आप किसी तालिका में रिकॉर्ड करने के लिए लिंक करना चाहते हैं जहां कोई समस्या हो सकती है, और यह भविष्य में सहित डेटाबेस में (लगभग) सभी तालिकाएं हो सकती हैं।पी>
बेशक आपको दो . की आवश्यकता होगी लिंक करने के लिए फ़ील्ड:एक विदेशी कुंजी फ़ील्ड और उस तालिका का नाम जिससे वह लिंक कर रहा है। आइए उन्हें foreignId
कहते हैं और linkedTable
linkedTable
एक एनम या एक स्ट्रिंग हो सकती है, अधिमानतः एनम (कम जगह), लेकिन यह केवल तभी संभव है जब आप जिन विभिन्न तालिकाओं से लिंक करना चाहते हैं, वे तय हैं।
आइए एक बेहद मूर्खतापूर्ण उदाहरण दें। आपके पास एक विशाल उपयोगकर्ता तालिका है users
जिनमें से कुछ उपयोगकर्ता बिल्कुल एक . जोड़ सकते हैं उनकी प्रोफ़ाइल में डेटा का व्यक्तिगत सेट। यह एक शौक, एक पालतू जानवर, एक खेल के बारे में हो सकता है जिसका वे अभ्यास करते हैं या उनका पेशा। अब यह जानकारी चारों मामलों में अलग है। (4 संभावित टेबल हकीकत में हैं नहीं इस संरचना को सही ठहराने के लिए पर्याप्त)
अब मान लेते हैं linkedTable
संभावित मूल्यों के साथ एक एनम है pets
, hobbies
, sports
और professions
, जो चार अलग-अलग संरचित तालिकाओं के नाम हैं। मान लें id
उन चारों में पेकी है।
उदाहरण के लिए आप इस प्रकार शामिल हों:
SELECT * FROM users
LEFT JOIN pets ON linkedTable = 'pets' AND foreignId = pets.id
LEFT JOIN hobbies ON linkedTable = 'hobbies' AND foreignId = hobbies.id
LEFT JOIN sports ON linkedTable = 'sports' AND foreignId = sports.id
LEFT JOIN professions ON linkedTable = 'professions' AND foreignId = professions.id
यह सिर्फ एक बुनियादी मजाक देने के लिए है। चूंकि आपको शायद केवल दुर्लभ मामलों में लिंक की आवश्यकता होती है, इसलिए जब आप उपयोगकर्ताओं के माध्यम से लूप करते हैं (बिना शामिल हुए) तो आप अपनी प्रोग्रामिंग भाषा, जैसे PHP, में लुकअप करने की अधिक संभावना रखते हैं।
आजमाना चाहते हैं? आप इस परीक्षण डेटाबेस के निर्माण के साथ इसे स्वयं आज़मा सकते हैं (सुनिश्चित करें कि आप एक परीक्षण डेटाबेस का उपयोग करते हैं):
CREATE TABLE IF NOT EXISTS `users` (
`id` INT NOT NULL AUTO_INCREMENT ,
`name` VARCHAR(100) NOT NULL ,
`linkedTable` ENUM('pets','hobbies','sports','professions') NULL DEFAULT NULL ,
`foreignId` INT NULL DEFAULT NULL ,
PRIMARY KEY (`id`), INDEX (`linkedTable`)
) ;
CREATE TABLE IF NOT EXISTS `pets` (
`id` INT NOT NULL AUTO_INCREMENT ,
`animalTypeId` INT NOT NULL ,
`name` VARCHAR(100) NOT NULL ,
`colorId` INT NOT NULL ,
PRIMARY KEY (`id`), INDEX (`animalTypeId`), INDEX (`colorId`)
) ;
CREATE TABLE IF NOT EXISTS `hobbies` (
`id` INT NOT NULL AUTO_INCREMENT ,
`hobbyTypeId` INT NOT NULL ,
`hoursPerWeekSpend` INT NOT NULL ,
`websiteUrl` VARCHAR(300) NULL ,
PRIMARY KEY (`id`), INDEX (`hobbyTypeId`)
) ;
CREATE TABLE IF NOT EXISTS `sports` (
`id` INT NOT NULL AUTO_INCREMENT ,
`sportTypeId` INT NOT NULL ,
`hoursPerWeekSpend` INT NOT NULL ,
`nameClub` VARCHAR(100) NULL ,
`professional` TINYINT NOT NULL DEFAULT 0,
PRIMARY KEY (`id`), INDEX (`sportTypeId`)
) ;
CREATE TABLE IF NOT EXISTS `professions` (
`id` INT NOT NULL AUTO_INCREMENT ,
`professionId` INT NOT NULL ,
`hoursPerWeek` INT NOT NULL ,
`nameCompany` VARCHAR(100) NULL ,
`jobDescription` VARCHAR(400) NULL,
PRIMARY KEY (`id`), INDEX (`professionId`)
) ;
INSERT INTO `users` (`id`, `name`, `linkedTable`, `foreignId`)
VALUES
(NULL, 'Hank', 'pets', '1'),
(NULL, 'Peter', 'hobbies', '2'),
(NULL, 'Muhammed', 'professions', '1'),
(NULL, 'Clarice', NULL, NULL),
(NULL, 'Miryam', 'professions', '2'),
(NULL, 'Ming-Lee', 'hobbies', '1'),
(NULL, 'Drakan', NULL, NULL),
(NULL, 'Gertrude', 'sports', '2'),
(NULL, 'Mbase', NULL, NULL);
INSERT INTO `pets` (`id`, `animalTypeId`, `name`, `colorId`)
VALUES (NULL, '1', 'Mimi', '3'), (NULL, '2', 'Tiger', '8');
INSERT INTO `hobbies` (`id`, `hobbyTypeId`, `hoursPerWeekSpend`, `websiteUrl`)
VALUES (NULL, '123', '21', NULL), (NULL, '2', '1', 'http://www.freesoup.org');
INSERT INTO `sports` (`id`, `sportTypeId`, `hoursPerWeekSpend`, `nameClub`, `professional`)
VALUES (NULL, '2', '3', 'Racket to Racket', '0'), (NULL, '12', '34', NULL, '1');
INSERT INTO `professions` (`id`, `professionId`, `hoursPerWeek`, `nameCompany`, `jobDescription`)
VALUES (NULL, '275', '40', 'Ben & Jerry\'s', 'Ice cream designer'), (NULL, '21', '24', 'City of Dublin', 'Garbage collector');
फिर पहली क्वेरी चलाएँ।
चर्चा के लिए मजेदार नोट:आप इसे अनुक्रमित करें?