"দুটি টেবিল দূরে" সীমাবদ্ধতা প্রয়োগ


10

এসকিউএল তে বৈদ্যুতিক স্কিম্যাটিক মডেলিং করতে আমি কিছুটা সমস্যায় পড়লাম। কাঠামোটি আমি ক্যাপচার করতে চাই

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

যেখানে "ইনস্ট্যান্স" "উদাহরণ" এর জন্য সংক্ষিপ্ত।

উদাহরণস্বরূপ, আমার কাছে partএকটি এলএম 358 অপ-অ্যাম্প হিসাবে pinএস 1OUT, 1IN-, 1IN +, GND, 2IN +, 2IN-, 2 আউট এবং ভি সিসি থাকতে পারে । আমি তখন এই অংশটি একটি স্কিম্যাটিকের উপর রেখে একটি part_instএবং 8 pin_instটি তৈরি করতে পারি ।

ডেটা ক্ষেত্রগুলি উপেক্ষা করে স্কিমাতে আমার প্রথম চেষ্টা ছিল

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_instpart_id=1pinpart_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_idpin_inst.part_inst.part_id = pin_inst.pin.part_idমাত্রাতিরিক্ত ভার্বোস না হয়ে আমি প্রতিবন্ধকতাটি প্রয়োগ করতে পারি এমন আরও কোনও উপায় আছে ?


আপনি pin_inst_idএটিও রিডানডেন্সি অপসারণ করতে পারেন । আপনি (part_inst_id, part_id, pin_id)প্রাথমিক কী হিসাবে ব্যবহার করতে পারেন ।
ypercubeᵀᴹ

দুটি জিনিস: (ক) 1 আউট, 1 আইএন-, 1 আইএন +, জিএনডি, 2 আইএন +, 2 আইএন-, 2 আউট, এবং ভিসিসি 11 টি পিনের উদাহরণ দেয়? (খ) আমি আপনার প্রাথমিক স্কিমাটি পাই না। একটি পিন একাধিক অংশে ব্যবহার করা যাবে না? পিন এবং পার্ট 1-এন এর মধ্যে আপনার এনএন সম্পর্ক দরকার।
মার্কাস জুনিয়াস ব্রুটাস

@ ব্যবহারকারী 34332: (ক) সংখ্যাগুলি নামের অংশ। উদাহরণস্বরূপ, "2OUT" একটি একক পিন। আমি যে চিপটির কথা বলছি তার একটি পরিকল্পনামূলক অঙ্কন এখানে । (খ) আমি একমত নই অবশ্যই দুটি অংশে একটি ভিসি (পজিটিভ সাপ্লাই ভোল্টেজ, "ভোল্টেজ [at] সাধারণ সংগ্রাহক")) পিন থাকতে পারে তবে সেগুলি যৌক্তিকভাবে আলাদা পিন। উদাহরণস্বরূপ, একটি ভিসিসি পিন সাধারণত 500 µA এবং অন্য একটি 250 µA আঁকতে পারে।
স্নোবল

@ স্নোবল আপনি যদি নমুনা ডেটার সাথে এসকিউএল-ফিডল যুক্ত করেন তবে এটি অন্যদের আপনার স্কিমা বুঝতে সাহায্য করবে ।
ypercubeᵀᴹ

উত্তর:


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প্রথমে অনন্য প্রতিবন্ধকতা রাখি । এটি রেফারেনশিয়াল অখণ্ডতার জন্য অপ্রাসঙ্গিক তবে এটি পারফরম্যান্সের জন্য গুরুত্বপূর্ণ। প্রাথমিক কীগুলি ইতিমধ্যে পিকে কলামগুলির জন্য সূচি প্রয়োগ করে। অনন্য সীমাবদ্ধতাগুলি প্রয়োগ করে মাল্টিকালম ইনডেক্সগুলিতে প্রথমে অন্য কলামটি রাখা ভাল । এই সম্পর্কিত প্রশ্নের অধীনে বিশদ:

এসও সম্পর্কিত সম্পর্কিত প্রশ্ন:

ট্রিগারগুলির সাথে বিকল্প

আপনি ট্রিগার ফাংশনগুলি অবলম্বন করতে পারেন যা আরও নমনীয় তবে কিছুটা জটিল এবং ত্রুটির প্রবণ এবং কিছুটা কম কঠোর। সুবিধা: আপনি ছাড়া part_inst.part_idএবং করতে পারেন pin.part_id...


এখানে কিছু অতিরিক্ত কলাম রয়েছে pin_insts, তবে আমি সেগুলি পড়ার স্বার্থে বাদ দিয়েছি ("ডেটা ক্ষেত্রগুলিকে উপেক্ষা করা, [...]")। উদাহরণস্বরূপ, একটি pin_instইনপুট বা আউটপুট হিসাবে চিহ্নিত হতে পারে।
স্নোবল

@ স্নোবল: সত্য হওয়া সহজ হত। আমি আপনার সমাধানটি কিছুটা প্রসারিত করেছি।
এরউইন ব্র্যান্ডস্টেটার

2
আপনার দ্বিতীয় পরামর্শটি আমার পরিস্থিতির জন্য ভাল কাজ করে। আমি জানতাম না যে কোনও বিদেশী কী প্রাথমিক কী ব্যতীত অন্য কিছু উল্লেখ করতে পারে।
স্নোবল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.