মাইএসকিউএলে সম্পর্ক কীভাবে তৈরি করবেন


98

ক্লাসে, আমরা সকলেই 'অধ্যয়নরত' ডাটাবেসগুলি এবং প্রত্যেকে অ্যাক্সেস ব্যবহার করে চলেছি। এটির বিরক্ত হয়ে আমি ক্লাসের বাকী অংশগুলি যা করছে তা করার চেষ্টা করছি, তবে অ্যাক্সেসের পরিবর্তে মাইএসকিউএল দিয়ে কাঁচা এসকিউএল কমান্ডগুলি দিয়ে।

আমি ডাটাবেস এবং টেবিল তৈরি করতে পরিচালিত করেছি, তবে এখন আমি কীভাবে দুটি টেবিলের মধ্যে সম্পর্ক তৈরি করব?

আমার কাছে যদি আমার দুটি টেবিল থাকে:

CREATE TABLE accounts(
    account_id INT NOT NULL AUTO_INCREMENT,
    customer_id INT( 4 ) NOT NULL ,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
    PRIMARY KEY ( account_id )
)

এবং

CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    PRIMARY KEY ( customer_id )
)

আমি কীভাবে দুটি টেবিলের মধ্যে 'সম্পর্ক' তৈরি করব? আমি প্রতিটি অ্যাকাউন্টকে একটি গ্রাহক_আইডিকে 'বরাদ্দ' করতে চাই (এটি কার মালিক তা বোঝাতে)।


49
"আমি অ্যাক্সেস অধ্যয়ন করতে প্রত্যাশা করেছি, আমি একটি বাস্তব ডাটাবেস ইঞ্জিন অধ্যয়ন করব: মাইএসকিউএল" এটাই আত্মা! অভিনন্দন = ডি
মেটাফ্যানিয়েল

4
নোট করুন যে বিদেশী মূল সীমাবদ্ধতাগুলি সম্পর্কগুলি প্রয়োগ করে না, তারা সততা প্রয়োগ করে। অ্যাকাউন্ট সারণীতে অ্যাকাউন্ট_আইডি এবং গ্রাহক_আইডির মধ্যে সমিতি সংশ্লিষ্ট সত্তাদের মধ্যে সম্পর্ককে কার্যকর করে।
পুনর্নির্মাণ

4
"এটাই স্পিরিট!", যতক্ষণ না এটি মাইআইএসএএম নয়, ইনোডিবি-র সাথে মাইএসকিএল থাকবে। এছাড়াও পোস্টগ্রিক্সএল এর মাইএসকিউএল-এর কয়েকটি আকর্ষণীয় বৈশিষ্ট্য রয়েছে যা দেখার মতো।
jgmjgm

উত্তর:


104

যদি টেবিলগুলি ইনোডাব হয় তবে আপনি এটির মতো এটি তৈরি করতে পারেন:

CREATE TABLE accounts(
    account_id INT NOT NULL AUTO_INCREMENT,
    customer_id INT( 4 ) NOT NULL ,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
    PRIMARY KEY ( account_id ), 
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id) 
) ENGINE=INNODB;

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


আমি একটি নিবন্ধে দেখেছি, যদি ইনোডিবি ডিফল্ট স্টোরেজ ইঞ্জিন হিসাবে সংজ্ঞায়িত হয় তবে ENGINE = InnoDB ধারাটি নির্দিষ্ট করার দরকার নেই, কমান্ডটি ব্যবহার করে পরীক্ষা করতে পারেন (mysql> SELECT @@ ডিফল্ট_ স্টোরেজ_েনজিন;)
অরুণ

81

যেমনটি ইহোগ বলেছেন, এটি আপনার তৈরি টেবিলে রাখুন

FOREIGN KEY (customer_id) REFERENCES customers(customer_id) 

বিকল্পভাবে, যদি আপনি ইতিমধ্যে টেবিলটি তৈরি করে থাকেন তবে একটি বিকল্প টেবিল কমান্ডটি ব্যবহার করুন:

ALTER TABLE `accounts`
  ADD CONSTRAINT `FK_myKey` FOREIGN KEY (`customer_id`) REFERENCES `customers` (`customer_id`) ON DELETE CASCADE ON UPDATE CASCADE;

এই কমান্ডগুলি শিখতে শুরু করার একটি ভাল উপায় হ'ল মাইএসকিউএল জিইউআই সরঞ্জামগুলি , যা আপনাকে আপনার ডাটাবেসের সাথে কাজ করার জন্য আরও "ভিজ্যুয়াল" ইন্টারফেস দেয়। এর আসল উপকারিতা (অ্যাক্সেসের পদ্ধতির বাইরে) হ'ল জিইউআইয়ের মাধ্যমে আপনার টেবিলটি ডিজাইনের পরে এটি আপনাকে যে এসকিউএল চালাচ্ছে তা দেখায় এবং তাই আপনি সেখান থেকে শিখতে পারেন।


4
আপনার উত্তরটি সেরা সমাধান
ওমর

15
CREATE TABLE accounts(
    account_id INT NOT NULL AUTO_INCREMENT,
    customer_id INT( 4 ) NOT NULL ,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
    PRIMARY KEY ( account_id )
)

and

CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
)

How do I create a 'relationship' between the two tables? I want each account to be 'assigned' one customer_id (to indicate who owns it).

নিজেকে জিজ্ঞাসা করতে হবে এটি 1 থেকে 1 টি সম্পর্ক বা অনেক সম্পর্কের মধ্যে 1 টি। অর্থাত, প্রতিটি অ্যাকাউন্টের কি গ্রাহক থাকে এবং প্রতিটি গ্রাহকের একটি অ্যাকাউন্ট থাকে? অথবা অ্যাকাউন্ট ছাড়া গ্রাহকরা থাকবেন। আপনার প্রশ্নটি পরেরটি বোঝায়।

আপনি যদি কঠোর 1 থেকে 1 টি সম্পর্ক রাখতে চান তবে কেবল দুটি টেবিল একত্রিত করুন।

CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)

অন্য ক্ষেত্রে, দুটি টেবিলের মধ্যে সম্পর্ক তৈরি করার সঠিক উপায় হ'ল একটি সম্পর্ক ছক তৈরি করা।

CREATE TABLE customersaccounts(
    customer_id INT NOT NULL,
    account_id INT NOT NULL,
    PRIMARY KEY (customer_id, account_id)
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
    FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
}

তারপরে যদি আপনার গ্রাহক_আইড থাকে এবং অ্যাকাউন্টের তথ্য চান, আপনি গ্রাহক অ্যাকাউন্ট এবং অ্যাকাউন্টগুলিতে যোগদান করুন:

SELECT a.*
    FROM customersaccounts ca
        INNER JOIN accounts a ca.account_id=a.account_id
            AND ca.customer_id=mycustomerid;

সূচকের কারণে এটি অন্ধভাবে দ্রুত হবে।

আপনি এমন একটি ভিউও তৈরি করতে পারেন যা সংযুক্ত গ্রাহকদের অ্যাকাউন্টের টেবিলটিকে আলাদা রাখার সময় আপনাকে প্রভাব দেয়

CREATE VIEW customeraccounts AS 
    SELECT a.*, c.* FROM customersaccounts ca
        INNER JOIN accounts a ON ca.account_id=a.account_id
        INNER JOIN customers c ON ca.customer_id=c.customer_id;

4
আমার মনে হয় আপনি বোঝানো ca.না ac.(3 স্থানে)।
উপবৃত্তাকার দর্শন

আপনি এর PRIMARY KEY (customer_id, account_id)পরে কমা ছাড়াই লিখেছেন
theonlygusti

11

Ehogue দ্বারা মন্তব্যটিতে যোগ করা, আপনার উভয় টেবিলের কীগুলির আকারটি মেলাতে হবে। বরং

customer_id INT( 4 ) NOT NULL ,

বানাও

customer_id INT( 10 ) NOT NULL ,

এবং গ্রাহক টেবিলের মধ্যে আপনার int কলামটিও অন্তর্নিহিত (10) রয়েছে তা নিশ্চিত করুন।


7

নির্দিষ্ট মাইএসকিউএল ইঞ্জিনগুলি বিদেশী কীগুলি সমর্থন করে। উদাহরণস্বরূপ, InnoDB বিদেশী কীগুলির উপর ভিত্তি করে প্রতিবন্ধকতা স্থাপন করতে পারে। আপনি যদি অন্য টেবিলে নির্ভরশীল এক টেবিলে এমন একটি এন্ট্রি মুছতে চেষ্টা করেন, মোছা ব্যর্থ হবে।

আপনি যদি মাইএসকিউএলে যেমন কোনও মাইএসএএমএল-তে কোনও টেবিল প্রকার ব্যবহার করছেন তবে এটি বিদেশী কীগুলি সমর্থন করে না, আপনি আপনার চিত্রগুলি এবং কোয়েরিগুলি বাদ দিয়ে অন্য কোথাও টেবিলগুলি লিঙ্ক করবেন না।

উদাহরণস্বরূপ, একটি ক্যোয়ারিতে আপনি একটি যোগদানের সাথে একটি নির্বাচিত বিবৃতিতে দুটি টেবিলকে লিঙ্ক করুন:

SELECT a, b from table1 LEFT JOIN table2 USING (common_field);

2

এখানে বেশ কয়েকটি সংস্থান রয়েছে যা শুরু করতে সহায়তা করবে: http://www.anchor.com.au/hosting/support/CreatingAQuickMySQLRelationalDatabase এবং http://code.tutsplus.com/articles/sql-for-beginners-part- 3-ডাটাবেস-সম্পর্ক - নেট-8561

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


যদি আপনি কেবল স্থানীয় অনুরোধগুলি পরিবেশন করতে অ্যাপাচি এবং মাইএসকিএল সেটআপ করেন তবে এগুলি বন্ধ করার দরকার নেই। এগুলি ছাড়াও যদি এই ধরণের পরিষেবাগুলি ইনস্টল করা হয় তবে ব্যবহারকারীদের খুব কমপক্ষে একটি সফ্টওয়্যার ফায়ারওয়াল ইনস্টল করা উচিত। এই কথাটি বলে, অনেক হোম রাউটারগুলি সেগুলিতে তৈরি একটি ফায়ারওয়াল নিয়ে আসে যাতে পোর্টগুলি রাউটারটিতে অ্যাক্সেস সহ কারও দ্বারা না খোলা না পারা যায়।
ক্রিস

1

আপনাকে যে নিয়মগুলি জানতে হবে তা হল আপনি যে সারণী কলামটি উল্লেখ করতে চান তা রেফারেন্সিং সারণির মতো একই ডেটা টাইপের সাথে থাকতে হবে। 2 যদি আপনি মাইএসকিএল ব্যবহার করার সিদ্ধান্ত নেন তবে আপনাকে ইনোডিবি ইঞ্জিন ব্যবহার করতে হবে কারণ আপনার প্রশ্নের প্রশ্ন অনুসারে ইঞ্জিনটি যা আপনি মাইএসকিএলে অর্জন করতে চান তা সমর্থন করে।

বেলো হ'ল কোডটি চেষ্টা করে দেখুন যদিও প্রথম জনগণ এই প্রশ্নের উত্তর দেওয়ার জন্য তারা 100% দুর্দান্ত উত্তর সরবরাহ করেছিল এবং দয়া করে তাদের সমস্ত বিবেচনা করুন।

CREATE TABLE accounts(
    account_id INT NOT NULL AUTO_INCREMENT,
    customer_id INT( 4 ) NOT NULL ,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
    PRIMARY KEY (account_id)
)ENGINE=InnoDB;

CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
     PRIMARY KEY ( account_id ), 
FOREIGN KEY (customer_id) REFERENCES customers(customer_id) 
)ENGINE=InnoDB; 

0
create table departement(
    dep_id      int primary key auto_increment,
    dep_name    varchar(100) not null,
    dep_descriptin      text,
    dep_photo       varchar(100) not null,
    dep_video       varchar(300) not null
);

create table newsfeeds(
    news_id         int primary key auto_increment,
    news_title      varchar(200) not null,
    news_description    text,
    news_photo          varchar(300) ,
    news_date           varchar(30) not null,
    news_video          varchar(300),
    news_comment        varchar(200),
    news_departement    int foreign key(dep_id) references departement(dep_id)
);

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