দুটি টেবিল মাইএসকিউএল এর উত্তরাধিকার মডেল কিভাবে


14

আমার কিছু টেবিল রয়েছে যেখানে আমি ডেটা সঞ্চয় করি এবং যে কোনও ব্যক্তির (কর্মী, নাগরিক) ধরণের কাজ করে যা আমি এটি একটি eventটেবিলে সংরক্ষণ করতে চাই তার উপর নির্ভর করে এখন এই ছেলেরা একটি প্রাণীকে উদ্ধার করে (একটি animalটেবিল রয়েছে)।

পরিশেষে, আমি এই ইভেন্টটি সংরক্ষণ করতে একটি টেবিল রাখতে চাই যে কোনও লোক (শ্রমিক, সিভিল) একটি প্রাণীকে রক্ষা করেছে, তবে আমার কি একটি বিদেশী কী যুক্ত করা উচিত বা কীভাবে idকাজটি করা সিভিল বা কর্মীর মূল্য জানতে পারি?

এখন, এই নকশায় আমি জানি না যে কোন ব্যক্তির কাজটি কীভাবে করা হয়েছে তা সম্পর্কে কীভাবে জানাতে হয়, যদি আমি কেবল এক ধরণের ব্যক্তি (ওরফে সিভিল) থাকতাম তবে আমি কেবল এই শেষ টেবিলের civil_idএকটি personকলামে খালিটি সংরক্ষণ করতাম ... তবে কীভাবে জেনে রাখুন এটি সিভিল বা কর্মী ছিল কিনা, আমার অন্যান্য "মধ্যবর্তী" টেবিলের দরকার নেই?

মাইএসকিউএলে নিম্নলিখিত চিত্রের নকশাটি কীভাবে প্রতিবিম্বিত করবেন?

এখানে চিত্র বর্ণনা লিখুন

অতিরিক্ত তথ্য

আমি নিম্নলিখিত পদ্ধতিতে এটি মডেল করেছি:

DROP    TABLE IF EXISTS `tbl_animal`; 
CREATE TABLE `tbl_animal` (
    id_animal       INTEGER     NOT NULL PRIMARY KEY AUTO_INCREMENT,
    name            VARCHAR(25) NOT NULL DEFAULT "no name",
    specie          VARCHAR(10) NOT NULL DEFAULT "Other",
    sex             CHAR(1)     NOT NULL DEFAULT "M",
    size            VARCHAR(10) NOT NULL DEFAULT "Mini",
    edad            VARCHAR(10) NOT NULL DEFAULT "Lact",
    pelo            VARCHAR(5 ) NOT NULL DEFAULT "short",
    color           VARCHAR(25) NOT NULL DEFAULT "not defined",
    ra              VARCHAR(25) NOT NULL DEFAULT "not defined",
    CONSTRAINT `uc_Info_Animal` UNIQUE (`id_animal`)           
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;


INSERT INTO `tbl_animal` VALUES (1,'no name', 'dog', 'M','Mini','Lact','Long','black','Bobtail');
INSERT INTO `tbl_animal` VALUES (2,'peluchin', 'cat', 'M','Mini','Lact','Long','white','not defined');
INSERT INTO `tbl_animal` VALUES (3,'asechin', 'cat', 'M','Mini','Lact','Corto','orange','not defined');

DROP    TABLE IF EXISTS `tbl_person`;  
CREATE TABLE `tbl_person` (
    type_person  VARCHAR(50) NOT NULL primary key        
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
INSERT INTO `tbl_person` (type_person) VALUES ('Worker');
INSERT INTO `tbl_person` (type_person) VALUES ('Civil');



DROP    TABLE IF EXISTS `tbl_worker`;  
CREATE TABLE `tbl_worker`(
    id_worker           INTEGER  NOT NULL PRIMARY KEY,
    type_person         VARCHAR(50) NOT NULL , 
    name_worker         VARCHAR(50) NOT NULL ,    
    address_worker      VARCHAR(40) NOT NULL DEFAULT "not defined",     
    delegation          VARCHAR(40) NOT NULL DEFAULT "not defined",
    FOREIGN KEY (type_person)               REFERENCES `tbl_person` (type_person),
    CONSTRAINT `uc_Info_worker` UNIQUE (`id_worker`)           
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

INSERT INTO `tbl_worker` VALUES (1,'Worker','N_CEDENTE1', 'DIR Worker 1', 'DEL');
INSERT INTO `tbl_worker` VALUES (2,'Worker','N_worker1', 'DIR Worker 2', 'DEL');
INSERT INTO `tbl_worker` VALUES (3,'Worker','N_worker2', 'address worker','delegation worker'); 


DROP    TABLE IF EXISTS `tbl_civil`; 
CREATE TABLE `tbl_civil`(
    id_civil                        INTEGER  NOT NULL PRIMARY KEY,
    type_person         VARCHAR(50) NOT NULL ,
    name_civil                      VARCHAR(50)  ,
    procedence_civil                VARCHAR(40)  NOT NULL DEFAULT "Socorrism",    
  FOREIGN KEY (type_person)             REFERENCES `tbl_person` (type_person),
    CONSTRAINT `uc_Info_civil` UNIQUE (`id_civil`)           
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;


INSERT INTO `tbl_civil`  VALUES (1,'Civil','N_civil1' , 'Socorrism');


CREATE TABLE `tbl_event` (
    id_event     INTEGER NOT NULL,
    id_animal    INTEGER NOT NULL,
    type_person  VARCHAR(50) NOT NULL , 
    date_reception DATE DEFAULT '2000-01-01 01:01:01',
    FOREIGN KEY (id_animal)   REFERENCES `tbl_animal`    (id_animal),
    FOREIGN KEY (type_person )  REFERENCES `tbl_person`   (type_person ),
    CONSTRAINT `uc_Info_ficha_primer_ingreso` UNIQUE (`id_animal`,`id_event`)     
)ENGINE=InnoDB  DEFAULT CHARSET=utf8;

INSERT INTO `tbl_event` VALUES (1,1, 'Worker','2013-01-01 01:01:01' );
INSERT INTO `tbl_event` VALUES (2,2, 'Civil','2013-01-01 01:01:01' );

তবে শূন্যতা থেকে মুক্তি পাওয়ার কোনও উপায় আছে কি?

আমার কাছে থাকা প্রশ্নগুলি হ'ল:

SELECT  a.*,b.*,z.*
FROM    tbl_event a
        left JOIN tbl_worker b
            ON a.type_person = b.type_person
        left JOIN tbl_animal z
            ON   z.id_animal = a.id_animal ;

SELECT  a.*,b.*,z.*
FROM    tbl_event a
        left JOIN tbl_civil b
            ON a.type_person = b.type_person
        left JOIN tbl_animal z
            ON   z.id_animal = a.id_animal ;

এখানে একটি আপডেট স্কেলফিল্ডল


TYPE_PERSONএটিতে কেবল একটি কলাম থাকা সারণীর উদ্দেশ্য কী ?
জেডাব্লু 웃


@ সিমনোর - আপনি জিজ্ঞাসা করছেন "কীভাবে কাজটি করেছেন সেই সিভিল বা কর্মীর আইডি জানতে?" আপনি কি বাস্তব জীবনে কে কাজটি করেছেন জানেন (বা কাল্পনিক, যদি এটি কোনও হোমওয়ার্ক হয়)? আপনার কাছে পর্যাপ্ত উত্সের ডেটা রয়েছে?

আমি উত্তরাধিকারে অভ্যস্ত হয়ে যাচ্ছি, সুতরাং আমি একটি টেবিল ব্যক্তি তৈরি করেছি যা লোকের ধরণের (শ্রমিক, নাগরিক) ধরে রাখবে, তারপরে ইভেন্ট টেবিলে, কীভাবে কোনও ব্যক্তিকে রেফারেন্স করতে হবে কীভাবে কাজের (সিভিল বা কর্মী) উপর নির্ভর করে?
সিমনোর

1
আমি বিশ্বাস করি আপনি ডেটাবেস প্রশাসকদের আরও ভাল পরামর্শ পাবেন
পিটার জেরকেন্স

উত্তর:


13

যেহেতু আমি চিত্রটি তৈরি করেছি, আমি আরও ভাল উত্তর দিই;)

বর্তমান সম্পর্কিত সম্পর্কিত ডাটাবেসগুলি দুর্ভাগ্যক্রমে উত্তরাধিকারকে সরাসরি সমর্থন করে না, সুতরাং আপনাকে এটিকে "সাধারণ" টেবিলগুলিতে রূপান্তর করতে হবে। এটি করার জন্য সাধারণত 3 টি কৌশল রয়েছে:

  1. সমস্ত ক্লাস 1 নূল-সক্ষম অ-সাধারণ ক্ষেত্রগুলির সাথে একক টেবিলে।
  2. কংক্রিট ক্লাস 2 পৃথক টেবিল। বিমূর্ত শ্রেণীর নিজস্ব টেবিল নেই।
  3. পৃথক টেবিলগুলিতে সমস্ত ক্লাস।

এর প্রকৃত অর্থ কী এবং আরও কিছু উপকারিতা সম্পর্কে আরও তথ্যের জন্য, দয়া করে আমার মূল পোস্টে প্রদত্ত লিঙ্কগুলি দেখুন তবে সংক্ষেপে (3) সম্ভবত আপনার ডিফল্ট হওয়া উচিত যদি না আপনি অন্য দুটির একটির জন্য নির্দিষ্ট কারণ না পান। আপনি সহজেই ডাটাবেজে (3) উপস্থাপন করতে পারেন:

CREATE TABLE person (
    person_id int PRIMARY KEY
    -- Other fields...
);

CREATE TABLE civil (
    civil_id int PRIMARY KEY REFERENCES person (person_id)
    -- Other fields...
);

CREATE TABLE worker (
    worker_id int PRIMARY KEY REFERENCES person (person_id)
    -- Other fields...
);

CREATE TABLE event (
    event_id int PRIMARY KEY,
    person_id int REFERENCES person (person_id)
    -- Other fields...
);

দুর্ভাগ্যক্রমে, এই কাঠামোটি আপনাকে এমন একটি দেবে personযা না হয় civilনা worker(যেমন আপনি বিমূর্ত শ্রেণিটি ইনস্ট্যান্ট করতে পারেন), এবং আপনাকে এমন একটি তৈরি personকরতে দেয় যা উভয় civil এবং উভয়ইworker । ডাটাবেস স্তরে প্রাক্তনকে প্রয়োগ করার বিভিন্ন উপায় রয়েছে এবং একটি ডিবিএমএসে 3 টি পিছিয়ে দেওয়া সীমাবদ্ধতাগুলিকে সমর্থন করে এমনকি এমনকি পরবর্তীগুলিকে ইন-ডাটাবেসে প্রয়োগ করা যেতে পারে, তবে এটি কয়েকটি ক্ষেত্রেই একটি যেখানে অ্যাপ্লিকেশন-স্তরের সততা ব্যবহার করা আসলেই পছন্দনীয় হতে পারে ।


1 person , civilএবং workerএই ক্ষেত্রে।

2 civil এবং workerএই ক্ষেত্রে ( person"বিমূর্ত")।

3 যা মাইএসকিউএল করে না।


পরে কীভাবে ডিবিএমএসে কার্যকর করা যায় যা স্থগিত প্রতিবন্ধকতাগুলিকে সমর্থন করে? (উভয় হওয়া থেকে একজন ব্যক্তির নামঞ্জুর করার civilএবং worker)
Gima

@ গিমা দয়া করে উত্তরে প্রদত্ত লিঙ্কটি অনুসরণ করুন।
ব্র্যাঙ্কো দিমিত্রিজেভিক

আপনি দাবি করেন যে বর্তমানের সম্পর্কিত ডেটাবেসগুলি উত্তরাধিকার সমর্থন করে না। পোস্টগ্রেস্কল সম্পর্কে কী? postgresql.org/docs/9.6/static/ddl-inherit.html
ক্লাইম্যাক্স

@ ক্লাইম্যাক্স আমি পোস্টগ্রিজ এসকিউএল সম্পর্কে সচেতন, তবে এর বাস্তবায়ন কেবল আংশিক। আপনার লিঙ্কটি থেকে: "অন্যান্য ধরণের প্রতিবন্ধকতা (অনন্য, প্রাথমিক কী এবং বিদেশী কী বাধা) উত্তরাধিকার সূত্রে প্রাপ্ত হয় না" "
ব্র্যাঙ্কো দিমিত্রিজেভিচ

1
@naaz পররাষ্ট্র কী উভয় মধ্যে উপস্থিত civilএবং worker। সম্ভবত আপনি সংক্ষিপ্ত হাতের সিনট্যাক্সটি মিস করেছেন (কেবল REFERENCESছাড়াই FOREIGN KEY)?
ব্র্যাঙ্কো দিমিত্রিজেভিক

5

স্বতন্ত্র সিভিল_আইডি এবং কর্মী_আইডি দরকার নেই; কেবলমাত্র ব্যক্তি, নাগরিক এবং কর্মী তিনটি সারণীর জন্য কী হিসাবে ব্যক্তি-আইডি ব্যবহার করা চালিয়ে যান। "সিভিল" এবং "কর্মী" এই দুটি মান সহ ব্যক্তিতে একটি কলাম ব্যক্তিত্ব টাইপ করুন।

এটি এখন দুটি উপ-শ্রেণীর সিভিলক্লাস এবং বেস সত্ত্বা ব্যক্তির উপ-সত্তা সিভিল এবং কর্মী হিসাবে অ্যাবস্ট্রাক্ট বেস ক্লাস পার্সনক্লাসের ওয়ার্কারক্লাসকে উপস্থাপন করে। আপনি অ্যাপ্লিকেশনটিতে অবজেক্ট মডেলের সাথে ডিবিতে ডেটা মডেলটির মধ্যে একটি দুর্দান্ত চিঠিপত্র পাবেন।


আমি একটি স্ক্লাফিল্ড স্ক্লাফিল্ড. com/ #!2/ 1f6a4/1 করেছি কিন্তু আমি অন্য টেবিলে যোগদান করতে জানি না, আপনি কি দয়া করে এখানে উত্তরটি স্ক্যালফিল্ডে উল্লেখ করতে পারেন?
সিমনোর

কোনও "স্বতন্ত্র" নেই civil_idএবং worker_id- এগুলি একই জিনিস, যেমন person_idনামকরণ করা হয়েছে আলাদাভাবে - FK1তাদের সামনে (বিদেশী কী) চিহ্নিতকারীটি দেখুন।
ব্র্যাঙ্কো দিমিত্রিজেভিক

4

আপনার কেস ক্লাস / সাবক্লাস মডেলিংয়ের উদাহরণ। অথবা, আপনি যেমনটি এআরটিতে সাধারণ চিত্র / বিশেষায়নের মাধ্যমে চিত্র আঁকেন।

তিনটি কৌশল রয়েছে যা আপনাকে এই কেসটি কভার করতে মাইএসকিএল টেবিল ডিজাইন করতে সহায়তা করবে। তাদের একক টেবিল উত্তরাধিকার, শ্রেণি সারণী উত্তরাধিকার এবং ভাগ করা প্রাথমিক কী বলা হয়। আপনি তাদের মধ্যে এসওতে সংশ্লিষ্ট ট্যাগ থেকে তথ্য ট্যাবে পড়তে পারেন।

/programming//tags/single-table-inheritance/info

/programming//tags/class-table-inheritance/info

/programming//tags/shared-primary-key/info

একক টেবিলের উত্তরাধিকার সাধারণ ক্ষেত্রে কার্যকর যেখানে NUL উপস্থিতি সমস্যা সৃষ্টি করে না। ক্লাস টেবিল উত্তরাধিকার আরও জটিল ক্ষেত্রে ভাল। ভাগ করা প্রাথমিক কীটি একে অপরের সম্পর্ককে প্রয়োগ করার এবং গতিতে যোগ দেওয়ার একটি ভাল উপায়।


1

আপনি কোনও ব্যক্তি টাইপ টেবিল তৈরি করতে পারেন এবং প্রকার প্রয়োগের জন্য প্রয়োজনীয় সমস্ত টেবিলগুলিতে একটি ক্ষেত্র যুক্ত করতে পারেন। তারপরে বিদেশী কী তৈরি করুন। আপনার থেকে প্রাপ্ত উদাহরণ এখানে ...

    CREATE TABLE person_type (
        person_type_id int PRIMARY KEY
        -- data: 1=civil, 2=worker
        -- Other fields (such as a label)...
    );

    CREATE TABLE person (
        person_id int PRIMARY KEY
        person_type_id int FOREIGN KEY REFERENCES person_type (person_type_id)
        -- Other fields...
    );

    CREATE TABLE civil (
        civil_id int PRIMARY KEY REFERENCES person (person_id)
        person_type_id int FOREIGN KEY REFERENCES person (person_type_id)
        -- Other fields...
    );

    CREATE TABLE worker (
        worker_id int PRIMARY KEY REFERENCES person (person_id)
        person_type_id int FOREIGN KEY REFERENCES person (person_type_id)
        -- Other fields...
    );

    CREATE TABLE event (
        event_id int PRIMARY KEY,
        person_id int REFERENCES person (person_id)
        -- Type is optional here, but you could enforce event for a particular type
        person_type_id int FOREIGN KEY REFERENCES person (person_type_id)
        -- Other fields...
    );
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.