शुरू करने से पहले, मैं यह बताना चाहता हूं कि "गैस" या तो ईंधन या एक प्रकार के इंजन का वर्णन करता है, न कि एक प्रकार का सेडान। इस रास्ते पर आगे बढ़ने से पहले अच्छी तरह सोच लें। (अधिकांश लोगों के विचार से डेटाबेस डिज़ाइन में शब्दार्थ अधिक महत्वपूर्ण हैं।)
आप जो करना चाहते हैं वह काफी सरल है, लेकिन जरूरी नहीं कि आसान हो। इस तरह के सुपरटाइप/सबटाइप डिज़ाइन (जिसे एक्सक्लूसिव आर्क के रूप में भी जाना जाता है) में महत्वपूर्ण बिंदु अर्ध-ट्रकों आदि के बारे में पंक्तियों को संदर्भित करने वाली सेडान के बारे में पंक्तियों को असंभव बनाना है।
MySQL कोड को अधिक वर्बोज़ बनाता है, क्योंकि यह CHECK बाधाओं को लागू नहीं करता है। तुम भाग्यशाली हो; आपके आवेदन में, CHECK बाधाओं को अतिरिक्त तालिकाओं और विदेशी कुंजी बाधाओं से बदला जा सकता है। टिप्पणियाँ SQL उपरोक्त को संदर्भित करती हैं उन्हें।
create table vehicle_types (
veh_type_code char(1) not null,
veh_type_name varchar(10) not null,
primary key (veh_type_code),
unique (veh_type_name)
);
insert into vehicle_types values
('s', 'Semi-truck'), ('c', 'Car');
यह ऐसी चीज है जिसे मैं अन्य प्लेटफॉर्म पर जांच बाधा के रूप में कार्यान्वित कर सकता हूं। आप ऐसा तब कर सकते हैं जब कोड का अर्थ उपयोगकर्ताओं के लिए स्पष्ट हो। मैं चाहता हूं कि उपयोगकर्ता यह जान लें या पता लगा लें कि 's' सेमी के लिए है और 'c' कारों के लिए है, या यह कि व्यू/एप्लिकेशन कोड उपयोगकर्ताओं से कोड छिपा देगा।
create table vehicles (
veh_id integer not null,
veh_type_code char(1) not null,
other_columns char(1) default 'x',
primary key (veh_id),
unique (veh_id, veh_type_code),
foreign key (veh_type_code) references vehicle_types (veh_type_code)
);
अद्वितीय बाधा कॉलम की जोड़ी {veh_id, veh_type_code} को विदेशी कुंजी संदर्भ का लक्ष्य बनने देती है। इसका मतलब है कि एक "कार" पंक्ति संभवतः गलती से भी "अर्ध" पंक्ति का संदर्भ नहीं दे सकती है।
insert into vehicles (veh_id, veh_type_code) values
(1, 's'), (2, 'c'), (3, 'c'), (4, 'c'), (5, 'c'),
(6, 'c'), (7, 'c');
create table car_types (
car_type char(3) not null,
primary key (car_type)
);
insert into car_types values
('Van'), ('SUV'), ('Sed');
create table veh_type_is_car (
veh_type_car char(1) not null,
primary key (veh_type_car)
);
कुछ और जो मैं अन्य प्लेटफॉर्म पर चेक बाधा के रूप में कार्यान्वित करता हूं। (नीचे देखें।)
insert into veh_type_is_car values ('c');
केवल एक पंक्ति कभी।
create table cars (
veh_id integer not null,
veh_type_code char(1) not null default 'c',
car_type char(3) not null,
other_columns char(1) not null default 'x',
primary key (veh_id ),
unique (veh_id, veh_type_code, car_type),
foreign key (veh_id, veh_type_code) references vehicles (veh_id, veh_type_code),
foreign key (car_type) references car_types (car_type),
foreign key (veh_type_code) references veh_type_is_car (veh_type_car)
);
veh_type_code के लिए डिफ़ॉल्ट मान, veh_type_is_car के विदेशी कुंजी संदर्भ के साथ, गारंटी देता है कि इस तालिका में यह पंक्तियाँ केवल कारों के बारे में हो सकती हैं, और केवल केवल हो सकती हैं संदर्भ वाहन जो कार हैं। अन्य प्लेटफॉर्म पर, मैं सिर्फ कॉलम veh_type_code को veh_type_code char(1) not null default 'c' check (veh_type_code = 'c')
के रूप में घोषित करता हूं। ।
insert into cars (veh_id, veh_type_code, car_type) values
(2, 'c', 'Van'), (3, 'c', 'SUV'), (4, 'c', 'Sed'),
(5, 'c', 'Sed'), (6, 'c', 'Sed'), (7, 'c', 'Sed');
create table sedan_types (
sedan_type_code char(1) not null,
primary key (sedan_type_code)
);
insert into sedan_types values
('g'), ('d'), ('h'), ('e');
create table sedans (
veh_id integer not null,
veh_type_code char(1) not null,
car_type char(3) not null,
sedan_type char(1) not null,
other_columns char(1) not null default 'x',
primary key (veh_id),
foreign key (sedan_type) references sedan_types (sedan_type_code),
foreign key (veh_id, veh_type_code, car_type) references cars (veh_id, veh_type_code, car_type)
);
insert into sedans (veh_id, veh_type_code, car_type, sedan_type) values
(4, 'c', 'Sed', 'g'), (5, 'c', 'Sed', 'd'), (6, 'c', 'Sed', 'h'),
(7, 'c', 'Sed', 'e');
यदि आपको अतिरिक्त तालिकाओं का निर्माण करना है जो सेडान को संदर्भित करती हैं, जैसे कि गैस_सेडान, डीजल_सेडान, आदि, तो आपको "veh_type_is_car" के समान एक-पंक्ति तालिका बनाने और उनके लिए विदेशी कुंजी संदर्भ सेट करने की आवश्यकता है।
उत्पादन में, मैं आधार तालिकाओं पर अनुमतियों को रद्द कर दूंगा, और या तो उपयोग करूंगा
- इन्सर्ट और अपडेट करने के लिए अपडेट करने योग्य दृश्य, या
- आवेषण और अद्यतन करने के लिए संग्रहीत कार्यविधियाँ।