"दो टेबल दूर" बाधाओं को लागू करना


10

मैं एसक्यूएल में एक विद्युत योजनाबद्ध मॉडलिंग में कुछ परेशानी में भाग गया। जिस संरचना पर मैं कब्जा करना चाहता हूं, वह है

  part ←────────── pin
                   
part_inst ←───── pin_inst

जहां "उदाहरण" "उदाहरण" के लिए छोटा है।

उदाहरण के लिए, मेरे पास partLM358 op-amp के रूप में pins 1OUT, 1IN-, 1IN +, GND, 2IN +, 2IN-, 2OUT और V CC के साथ हो सकता है । मैं तब इस हिस्से को एक योजनाबद्ध पर रख सकता हूं, part_instऔर 8 pin_insts बना सकता हूं ।

डेटा फ़ील्ड को अनदेखा करना, स्कीमा में मेरा प्रारंभिक प्रयास था

create table parts (
    part_id bigserial primary key
);
create table pins (
    pin_id bigserial primary key,
    part_id bigint not null references parts
);
create table part_insts (
    part_inst_id bigserial primary key,
    part_id bigint not null references parts
);
create table pin_insts (
    pin_inst_id bigserial primary key,
    part_inst_id bigint not null references part_insts,
    pin_id bigint not null references pins
);

इस स्कीमा के साथ मुख्य समस्या यह है कि यह pin_instएक के part_instसाथ बंधा हो सकता है , part_id=1लेकिन इसकी pinहै part_id=2

मैं आवेदन स्तर के बजाय डेटाबेस स्तर पर इस समस्या से बचना चाहूंगा। इसलिए, मैंने इसे लागू करने के लिए अपनी प्राथमिक कुंजियों को संशोधित किया। मैंने परिवर्तित लाइनों को चिह्नित किया है --

create table parts (
    part_id bigserial primary key
);
create table pins (
    pin_id bigserial,                                          --
    part_id bigint not null references parts,
    primary key (pin_id, part_id)                              --
);
create table part_insts (
    part_inst_id bigserial,                                    --
    part_id bigint not null references parts,
    primary key (part_inst_id, part_id)                        --
);
create table pin_insts (
    pin_inst_id bigserial primary key,
    part_inst_id bigint not null,                              --
    pin_id bigint not null,                                    --
    part_id bigint not null references parts,                  --
    foreign key (part_inst_id, part_id) references part_insts, --
    foreign key (pin_id, part_id) references pins              --
);

इस पद्धति के साथ मेरी पकड़ यह है कि यह प्राथमिक कुंजियों को प्रदूषित करती है: हर जगह जहां मैं एक का उल्लेख करता part_instहूं, मुझे दोनों part_inst_idऔर पर नज़र रखने की आवश्यकता है part_id। वहाँ एक और तरीका है कि मैं pin_inst.part_inst.part_id = pin_inst.pin.part_idअत्यधिक क्रिया किए बिना बाधा को लागू करने के बारे में जा सकता हूं ?


आप pin_inst_idजो अतिरेक है, उसे भी दूर कर सकते हैं। आप (part_inst_id, part_id, pin_id)प्राथमिक कुंजी के रूप में उपयोग कर सकते हैं ।
ypercube y

दो चीजें: (ए) 1 सेंस, 1IN-, 1IN +, GND, 2IN +, 2IN-, 2OUT, और VCC 11 पिन इंस्टेंस नहीं देता है? (बी) मुझे आपका प्रारंभिक स्कीमा नहीं मिला है। क्या एक से अधिक भाग में पिन का उपयोग नहीं किया जा सकता है? आपको पिन और एक नहीं 1-भाग के बीच एनएन संबंध की आवश्यकता है।
मार्कस जूनियस ब्रूटस

@ user34332: (a) संख्याएँ नामों का हिस्सा हैं। उदाहरण के लिए, "2OUT" एक एकल पिन है। यहाँ उस चिप की एक योजनाबद्ध ड्राइंग है जिसके बारे में मैं बात कर रहा हूँ। (b) मैं असहमत हूं। निश्चित रूप से दो भागों में एक वीसीसी (सकारात्मक आपूर्ति वोल्टेज, "वोल्टेज [पर] आम कलेक्टर") पिन हो सकता है, लेकिन वे तार्किक रूप से अलग पिन हैं। उदाहरण के लिए, एक VCC पिन आमतौर पर 500 aA और एक अलग 250 500A खींच सकता है।
स्नोबॉल

@Snowball यदि आप नमूना डेटा के साथ एक SQL- फ़ेल्ड जोड़ा तो यह आपके स्कीमा को समझने में दूसरों की मदद करेगा ।
ypercube y

जवाबों:


13

न्यूनतम समाधान

एक कट्टरपंथी समाधान pin_instपूरी तरह से हटाने के लिए हो सकता है :

  part ←────────── pin
                   
part_inst ←───── pin_inst

वास्तव में आपको अनावश्यक तालिका की आवश्यकता का सुझाव देने के लिए आपके प्रश्न में कुछ भी नहीं है। के लिए pinएक से जुड़े रों part_inst, पर नज़र pinजुड़े का रों part

यह कोड को सरल करेगा:

create table part (    -- using singular terms for table names
    part_id bigserial primary key
);
create table pin (
    pin_id bigserial primary key,
    part_id bigint not null references part
);
create table part_inst (
    part_inst_id bigserial primary key,
    part_id bigint not null references part
);

लेकिन आपकी टिप्पणी ने स्पष्ट कर दिया कि हम इससे दूर नहीं होंगे ...

यदि pin_instआवश्यक हो तो वैकल्पिक

भी शामिल है part_idजैसे तुमने किया था विदेशी कुंजी बाधाओं के साथ सरल समाधान है। आप विदेशी प्रमुख बाधाओं के साथ एक तालिका "दो टेबल दूर" का संदर्भ नहीं दे सकते ।

लेकिन आप प्राथमिक कुंजियों को "प्रदूषणकारी" किए बिना कम से कम कर सकते हैं। UNIQUEअड़चनें जोड़ें ।

create table part (
    part_id bigserial primary key
);
create table pin (
    pin_id bigserial primary key,
    part_id bigint not null references part,
    unique(part_id, pin_id)         -- note sequence of columns
);
create table part_inst (
    part_inst_id bigserial primary key,
    part_id bigint not null references part,
    unique(part_id, part_inst_id)
);
create table pin_inst (
    pin_inst_id bigserial primary key,
    part_inst_id bigint not null,
    pin_id bigint not null,
    part_id bigint not,
    foreign key (part_id, pin_id) references pin,
    foreign key (part_id, part_inst_id) references part_inst
);

मैंने part_idसबसे पहले अड़चनें डालीं। यह संदर्भात्मक अखंडता के लिए अप्रासंगिक है, लेकिन यह प्रदर्शन के लिए मायने रखता है। प्राथमिक कुंजियाँ पहले से ही pk कॉलम के लिए अनुक्रमित को लागू करती हैं। अद्वितीय अवरोधों को लागू करने वाले बहुरंगी अनुक्रमणिका में पहले दूसरे स्तंभ का होना बेहतर है । इन संबंधित प्रश्नों के विवरण:

SO पर संबंधित प्रश्न:

ट्रिगर्स के साथ वैकल्पिक

आप ट्रिगर्स फ़ंक्शंस का सहारा ले सकते हैं, जो अधिक लचीले होते हैं, लेकिन थोड़ा अधिक जटिल और त्रुटि प्रवण और थोड़ा कम सख्त होता है। लाभ: आप बिना कर सकते हैं part_inst.part_idऔर pin.part_id...


कुछ अतिरिक्त कॉलम हैं pin_insts, लेकिन मैंने उन्हें पठनीयता ("डेटा फ़ील्ड की अनदेखी, [...]" के हित में छोड़ दिया। उदाहरण के लिए, pin_instइनपुट या आउटपुट के रूप में चिह्नित किया जा सकता है।
स्नोबॉल

@Snowball: सच होना आसान होगा। मैंने आपके समाधान पर थोड़ा विस्तार किया।
एरविन ब्रान्डसेट्टर

2
आपका दूसरा सुझाव मेरी स्थिति के लिए अच्छा काम करता है। मुझे पता नहीं था कि एक विदेशी कुंजी प्राथमिक कुंजी के अलावा कुछ और संदर्भ दे सकती है।
स्नोबॉल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.