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


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_id। pin_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.