मेरे पास मध्यम "आकार" तालिका के साथ मध्यम आकार का MySQL डेटाबेस है जिसमें थिएटर और थियेटर स्कूल से जुड़े हर इंसान के बारे में बुनियादी संपर्क जानकारी है जिसके लिए मैं कई वेब को बनाए रखने और विकसित करने के लिए जिम्मेदार हूं अनुप्रयोगों।उपयोगकर्ता भूमिका निभाने के लिए पसंदीदा डेटाबेस डिजाइन विधि? (हैट बनाम समूह)
कुछ लोग केवल संपर्क हैं - यानी, उनके "व्यक्तियों" तालिका रिकॉर्ड उन सभी जानकारी हैं जिन्हें हमें उनके बारे में स्टोर करने की आवश्यकता है। कई अन्य लोगों को विभिन्न प्रणालियों के लिए अलग-अलग भूमिका निभाने में सक्षम होना चाहिए। इनमें से, ज्यादातर छात्रों के रूप में शुरू करते हैं। कुछ कर्मचारियों के रूप में शुरू करते हैं। जो लोग छात्र हैं वे इंटर्न या कलाकार बन सकते हैं; कर्मचारी छात्र बन सकते हैं; सभी शिक्षक कर्मचारी और कलाकार हैं, आदि
संक्षेप में, उनके विभिन्न प्रकार के "टोपी" हैं जो कि किसी भी व्यक्ति को सिस्टम के विभिन्न हिस्सों तक पहुंचने और बातचीत करने के लिए पहनना पड़ सकता है, साथ ही साथ उनके बारे में जानकारी हमारी साइट पर सार्वजनिक पृष्ठों पर उपलब्ध कराई गई।
इस मॉडल को लागू करने के लिए मेरी पसंद कई अन्य टेबल हैं जो इन "टोपी" का प्रतिनिधित्व करती हैं - सारणी जिसमें बुनियादी "व्यक्ति" जानकारी को पूरक करने के लिए मेटा-सूचना होती है, जिनमें से सभी "व्यक्तियों" आईडी को उनके प्राथमिक के रूप में उपयोग करते हैं कुंजी। उदाहरण के लिए, एक व्यक्ति जो शिक्षक होता है उसके पास एक शिक्षक तालिका में रिकॉर्ड होता है जिसमें उसकी छोटी जीवनी जानकारी और वेतन दर होती है। सभी शिक्षक भी कर्मचारी हैं (लेकिन सभी कर्मचारी शिक्षक नहीं हैं), जिसका अर्थ है कि उनके पास कर्मचारी तालिका में एक रिकॉर्ड है जो उन्हें अपने वेतन प्रणाली में अपना घंटे जमा करने की अनुमति देता है।
मेरा सवाल यह है कि मॉडल को लागू करने में क्या कमी है? एकमात्र अन्य विकल्प जो मैं सोच सकता हूं वह है कि व्यक्तियों की मेज को उन क्षेत्रों के साथ फुलाएं जो अधिकतर प्रविष्टियों के लिए खाली और बेकार होंगी और फिर "समूह" की एक बोझिल तालिका है जिसके लिए व्यक्ति संबंधित हो सकते हैं, और उसके बाद लगभग हर तालिका के लिए सिस्टम में person_id
विदेशी कुंजी है और फिर यह सत्यापित करने के लिए व्यावसायिक तर्क पर निर्भर करता है कि संदर्भित व्यक्ति_आईडी उचित समूह से संबंधित है; लेकिन वह बेवकूफ है, है ना?
कुछ उदाहरण तालिका घोषणाएं नीचे दी गई हैं, जो उम्मीद करनी चाहिए कि मैं वर्तमान में यह सब कैसे एक साथ रख रहा हूं, और उम्मीद है कि मुझे लगता है कि मुझे लगता है कि सिस्टम को विभिन्न स्थितियों की वास्तविकता का मॉडल करने का एक और समझदार तरीका क्यों है से निपटें।
कोई भी और सभी सुझाव और टिप्पणियां आपका स्वागत है। मैं आपके समय की सराहना करता हूं।
संपादित कुछ उत्तरदाताओं सुरक्षा के लिए एसीएल का उपयोग कर उल्लेख किया है - मैं अपने मूल प्रश्न में उल्लेख नहीं था कि मैं विभिन्न प्रणालियों की वास्तविक उपयोगकर्ताओं के लिए सुक्ष्म अभिगम नियंत्रण के लिए एक अलग एसीएल पैकेज का उपयोग वास्तव में कर रहा हूँ। मेरा प्रश्न डेटाबेस स्कीमा में लोगों के बारे में मेटाडेटा संग्रहीत करने के सर्वोत्तम प्रथाओं के बारे में अधिक है।
CREATE TABLE persons (
`id` int(11) NOT NULL auto_increment,
`firstName` varchar(50) NOT NULL,
`middleName` varchar(50) NOT NULL default '',
`lastName` varchar(75) NOT NULL,
`email` varchar(100) NOT NULL default '',
`address` varchar(255) NOT NULL default '',
`address2` varchar(255) NOT NULL default '',
`city` varchar(75) NOT NULL default '',
`state` varchar(75) NOT NULL default '',
`zip` varchar(10) NOT NULL default '',
`country` varchar(75) NOT NULL default '',
`phone` varchar(30) NOT NULL default '',
`phone2` varchar(30) NOT NULL default '',
`notes` text NOT NULL default '',
`birthdate` date NOT NULL default '0000-00-00',
`created` datetime NOT NULL default '0000-00-00 00:00',
`updated` timestamp NOT NULL,
PRIMARY KEY (`id`),
KEY `lastName` (`lastName`),
KEY `email` (`email`)
) ENGINE=InnoDB;
CREATE TABLE teachers (
`person_id` int(11) NOT NULL,
`bio` text NOT NULL default '',
`image` varchar(150) NOT NULL default '',
`payRate` float(5,2) NOT NULL,
`active` boolean NOT NULL default 0,
PRIMARY KEY (`person_id`),
FOREIGN KEY(`person_id`) REFERENCES `persons` (`id`)
ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB;
CREATE TABLE classes (
`id` int(11) NOT NULL auto_increment,
`teacher_id` int(11) default NULL,
`classstatus_id` int(11) NOT NULL default 0,
`description` text NOT NULL default '',
`capacity` tinyint NOT NULL,
PRIMARY KEY(`id`),
FOREIGN KEY(`teacher_id`) REFERENCES `teachers` (`id`)
ON DELETE RESTRICT ON UPDATE CASCADE,
FOREIGN KEY(`classstatus_id`) REFERENCES `classstatuses` (`id`)
ON DELETE RESTRICT ON UPDATE CASCADE,
KEY (`teacher_id`,`level_id`),
KEY (`teacher_id`,`classstatus_id`)
) ENGINE=InnoDB;
CREATE TABLE students (
`person_id` int(11) NOT NULL,
`image` varchar(150) NOT NULL default '',
`note` varchar(255) NOT NULL default '',
PRIMARY KEY (`person_id`),
FOREIGN KEY(`person_id`) REFERENCES `persons` (`id`)
ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB;
CREATE TABLE enrollment (
`id` int(11) NOT NULL auto_increment,
`class_id` int(11) NOT NULL,
`student_id` int(11) NOT NULL,
`enrollmenttype_id` int(11) NOT NULL,
`created` datetime NOT NULL default '0000-00-00 00:00',
`modified` timestamp NOT NULL,
PRIMARY KEY(`id`),
FOREIGN KEY(`class_id`) REFERENCES `classes` (`id`)
ON DELETE RESTRICT ON UPDATE CASCADE,
FOREIGN KEY(`student_id`) REFERENCES `students` (`id`)
ON DELETE RESTRICT ON UPDATE CASCADE,
FOREIGN KEY(`enrollmenttype_id`) REFERENCES `enrollmenttypes` (`id`)
ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB;
उत्तर के लिए धन्यवाद - मैं जुर्माना अनुमतियों के लिए एक अलग एसीएल पैकेज का उपयोग कर रहा हूं जो यह निर्धारित करता है कि उपयोगकर्ता साइट पर क्या कर सकता है या नहीं कर सकता है, इसलिए मैं संयोजन दृष्टिकोण के बारे में आपके साथ 100% समझौते में हूं। – notneilcasey