দুটি সম্ভাব্য টেবিলগুলির মধ্যে একটিতে মাইএসকিউএল বিদেশী কী করা সম্ভব?


180

আচ্ছা আমার সমস্যাটি এখানে আমার কাছে তিনটি টেবিল রয়েছে; অঞ্চল, দেশ, রাজ্য। দেশগুলি অঞ্চলের অভ্যন্তরে থাকতে পারে, রাজ্যগুলি অঞ্চলের অভ্যন্তরে থাকতে পারে। অঞ্চলগুলি খাদ্য চেইনের শীর্ষে রয়েছে।

এখন আমি দুটি কলাম সহ একটি জনপ্রিয়_আরিয়াস টেবিল যুক্ত করছি; অঞ্চল_আইডি এবং জনপ্রিয়_প্লেস_আইডি। জনপ্রিয়_প্লেইজ_আইডি কোনও দেশ বা রাজ্যের বিদেশী কী হিসাবে তৈরি করা সম্ভব ? আইডি কোনওভাবে দেশ বা রাষ্ট্রের বর্ণনা দিচ্ছে কিনা তা নির্ধারণ করতে আমি সম্ভবত একটি জনপ্রিয়_প্লেস_ টাইপ কলাম যুক্ত করতে যাচ্ছি।

উত্তর:


282

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

CREATE TABLE popular_places (
  user_id INT NOT NULL,
  place_id INT NOT NULL,
  place_type VARCHAR(10) -- either 'states' or 'countries'
  -- foreign key is not possible
);

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

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

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

এখানে কিছু বিকল্প সমাধান রয়েছে যা ডাটাবেস-প্রয়োগকারী রেফারেনশিয়াল অখণ্ডতার সুযোগ নেয়:

লক্ষ্য প্রতি একটি অতিরিক্ত টেবিল তৈরি করুন। উদাহরণস্বরূপ popular_statesএবং popular_countries, যথাক্রমে কোন রেফারেন্স statesএবং countries। এই "জনপ্রিয়" টেবিলগুলির প্রত্যেকটি ব্যবহারকারীর প্রোফাইলকেও উল্লেখ করে।

CREATE TABLE popular_states (
  state_id INT NOT NULL,
  user_id  INT NOT NULL,
  PRIMARY KEY(state_id, user_id),
  FOREIGN KEY (state_id) REFERENCES states(state_id),
  FOREIGN KEY (user_id) REFERENCES users(user_id),
);

CREATE TABLE popular_countries (
  country_id INT NOT NULL,
  user_id    INT NOT NULL,
  PRIMARY KEY(country_id, user_id),
  FOREIGN KEY (country_id) REFERENCES countries(country_id),
  FOREIGN KEY (user_id) REFERENCES users(user_id),
);

এর অর্থ এই নয় যে কোনও ব্যবহারকারীর জনপ্রিয় পছন্দের জায়গাগুলির জন্য আপনাকে এই দুটি সারণী উভয়েরই জিজ্ঞাসা করতে হবে। তবে এর অর্থ আপনি ধারাবাহিকতা প্রয়োগের জন্য ডাটাবেসের উপর নির্ভর করতে পারেন।

placesসুপার্টেবল হিসাবে একটি টেবিল তৈরি করুন । Abie উল্লেখ হিসাবে, একটি দ্বিতীয় বিকল্প আপনার জনপ্রিয় জায়গা মত একটা টেবিল রেফারেন্স places, যা উভয় একটি অভিভাবক হয় statesএবং countries। অর্থাৎ উভয় রাজ্যের ও দেশ এছাড়াও একটি বিদেশী কী আছে places(আপনি এমনকি করতে পারেন এই বিদেশী কী এছাড়াও প্রাথমিক কী হতে statesএবং countries)।

CREATE TABLE popular_areas (
  user_id INT NOT NULL,
  place_id INT NOT NULL,
  PRIMARY KEY (user_id, place_id),
  FOREIGN KEY (place_id) REFERENCES places(place_id)
);

CREATE TABLE states (
  state_id INT NOT NULL PRIMARY KEY,
  FOREIGN KEY (state_id) REFERENCES places(place_id)
);

CREATE TABLE countries (
  country_id INT NOT NULL PRIMARY KEY,
  FOREIGN KEY (country_id) REFERENCES places(place_id)
);

দুটি কলাম ব্যবহার করুন। দুটি লক্ষ্য সারণীর যে কোনও একটিতে উল্লেখ করতে পারে এমন কলামের পরিবর্তে দুটি কলাম ব্যবহার করুন। এই দুটি কলাম হতে পারে NULL; আসলে এর মধ্যে শুধুমাত্র একটি অ হওয়া উচিত NULL

CREATE TABLE popular_areas (
  place_id SERIAL PRIMARY KEY,
  user_id INT NOT NULL,
  state_id INT,
  country_id INT,
  CONSTRAINT UNIQUE (user_id, state_id, country_id), -- UNIQUE permits NULLs
  CONSTRAINT CHECK (state_id IS NOT NULL OR country_id IS NOT NULL),
  FOREIGN KEY (state_id) REFERENCES places(place_id),
  FOREIGN KEY (country_id) REFERENCES places(place_id)
);

রিলেশনাল তত্ত্বের ক্ষেত্রে, পলিমর্ফিক অ্যাসোসিয়েশনগুলি প্রথম সাধারণ ফর্মটি লঙ্ঘন করে , কারণ এটি popular_place_idকার্যকরভাবে একটি কলাম দুটি অর্থ সহ: এটি হয় একটি রাষ্ট্র বা একটি দেশ। আপনি কোনও ব্যক্তির ageএবং phone_numberসেগুলি একটি একক কলামে সংরক্ষণ করবেন না এবং একই কারণে আপনার উভয় state_idএবং country_idএকক কলামে সংরক্ষণ করা উচিত নয় । এই দুটি বৈশিষ্ট্যের সাথে সামঞ্জস্যপূর্ণ ডেটা টাইপ রয়েছে তা কাকতালীয়; তারা এখনও বিভিন্ন যৌক্তিক সত্তা বোঝায়।

পলিমারফিক অ্যাসোসিয়েশনগুলি তৃতীয় সাধারণ ফর্ম লঙ্ঘন করে , কারণ কলামটির অর্থ অতিরিক্ত কলামের উপর নির্ভর করে যা বিদেশী কী উল্লেখ করে সেই টেবিলের নাম দেয়। তৃতীয় নরমাল ফর্মে, একটি সারণীর কোনও বৈশিষ্ট্য অবশ্যই সেই টেবিলের প্রাথমিক কীতে নির্ভর করবে।


@ সাভাসভেদোভা থেকে মন্তব্য করুন:

আমি নিশ্চিত নন যে আমি টেবিলের সংজ্ঞা বা উদাহরণ কোয়েরি না করেই আপনার বিবরণটি অনুসরণ করেছি, তবে মনে হচ্ছে আপনার কেবল একাধিক Filtersটেবিল রয়েছে, প্রতিটিতে একটি বিদেশী কী রয়েছে যা একটি কেন্দ্রীয় Productsটেবিলের উল্লেখ করে ।

CREATE TABLE Products (
  product_id INT PRIMARY KEY
);

CREATE TABLE FiltersType1 (
  filter_id INT PRIMARY KEY,
  product_id INT NOT NULL,
  FOREIGN KEY (product_id) REFERENCES Products(product_id)
);

CREATE TABLE FiltersType2 (
  filter_id INT  PRIMARY KEY,
  product_id INT NOT NULL,
  FOREIGN KEY (product_id) REFERENCES Products(product_id)
);

...and other filter tables...

নির্দিষ্ট ধরণের ফিল্টারগুলিতে পণ্যগুলিতে যোগদান করা সহজ আপনি যদি জানেন যে আপনি কোন ধরণের সাথে যুক্ত হতে চান:

SELECT * FROM Products
INNER JOIN FiltersType2 USING (product_id)

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

বাইরের যোগদানগুলি ব্যবহার করে সমস্ত ফিল্টার টেবিলগুলিতে যোগদানের একমাত্র অন্য বিকল্প । যাঁদের সাথে মেলে প্রোডাক্ট_আইডি নেই তাদের কেবল একটি নালার একক সারি হিসাবে ফেরত দেওয়া হবে। তবে আপনাকে এখনও যোগ হওয়া সমস্ত টেবিলগুলিকে হার্ডকোড করতে হবে এবং আপনি যদি নতুন ফিল্টার টেবিল যোগ করেন তবে আপনাকে আপনার কোড আপডেট করতে হবে।

SELECT * FROM Products
LEFT OUTER JOIN FiltersType1 USING (product_id)
LEFT OUTER JOIN FiltersType2 USING (product_id)
LEFT OUTER JOIN FiltersType3 USING (product_id)
...

সমস্ত ফিল্টার টেবিলগুলিতে যোগদানের আরেকটি উপায় হ'ল এটি ক্রমিকভাবে করা:

SELECT * FROM Product
INNER JOIN FiltersType1 USING (product_id)
UNION ALL
SELECT * FROM Products
INNER JOIN FiltersType2 USING (product_id)
UNION ALL
SELECT * FROM Products
INNER JOIN FiltersType3 USING (product_id)
...

তবে এই ফর্ম্যাটটির জন্য আপনাকে সমস্ত সারণীতে রেফারেন্স লিখতে হবে। এর আশেপাশে কোনও লাভ নেই।


আপনি কোনটি বিল প্রস্তাব করবেন? আমি একটি ডাটাবেস ডিজাইনের মাঝখানে আছি তবে আমি হারিয়ে গেছি। আমার মূলত ফিল্টারগুলিকে একটি পণ্যের সাথে সংযুক্ত করতে হবে এবং ফিল্টারগুলির মানগুলি বিভিন্ন টেবিল জুড়ে পপুলেটেড হবে। তবে সমস্যাটি হ'ল ফিল্টারগুলি অ্যাডমিনদের দ্বারা উত্পন্ন করা হবে তাই ফিল্টার ধরণের উপর নির্ভর করে ডেটা আলাদা হতে পারে এবং joinসেইসাথে লক্ষ্যটিও পরিবর্তিত হবে ...... আমি কি খুব বেশি জটিলতা করছি বা কি? সাহায্য করুন!
সাভাস বেদোভা

+1 একটি দুর্দান্ত সমাধানের জন্য আপনাকে ধন্যবাদ। প্রথম / দ্বিতীয় সমাধানটির সাথে আমার একটি প্রশ্ন হ'ল: একাধিক টেবিলগুলি সেই মেটা-সারণীতে একই প্রাথমিক কীটি উল্লেখ করতে পারে তা নিয়ে কি কোনও স্বাভাবিকীকরণের লঙ্ঘন হয়? আমি জানি আপনি এটি যুক্তি দিয়ে সমাধান করতে পারেন, তবে আমি কিছু মিস করছি না, তবে ডাটাবেসের প্রয়োগ করার জন্য কোনও উপায় দেখছি না।
রব

5
আমি সত্যিই "চুক্তি পরীক্ষা" এর সাথে পন্থা পছন্দ করি। তবে যদি আমরা "ওআর" কে "এক্সওর" এ পরিবর্তন করি তবে এটি উন্নত হতে পারে। সেভাবে আমরা বীমা করি যে সেট থেকে কেবলমাত্র একটি
কলামই

1
@ অ্যালেক্স_ বি, হ্যাঁ, এটি ভাল তবে লজিক্যাল এক্সওআর স্ট্যান্ডার্ড এসকিউএল নয় এবং সমস্ত এসকিউএল ব্র্যান্ড দ্বারা সমর্থিত নয়। মাইএসকিউএল এটি রয়েছে, তবে পোস্টগ্রিসকিউএল এটি করে না। ওরাকল এর কাছে রয়েছে, তবে মাইক্রোসফ্ট 2016 পর্যন্ত তা করবে না And ইত্যাদি।
বিল কারভিন

1
"এই দুটি কলামটি নুল হতে পারে; বাস্তবে এর মধ্যে একটিরই নন-নুল হওয়া উচিত" - এটি 1NF লঙ্ঘন করবে !
onedaywhen

10

এটি বিশ্বের সবচেয়ে মার্জিত সমাধান নয়, তবে আপনি এই কাজটি করার জন্য কংক্রিটের টেবিলের উত্তরাধিকার ব্যবহার করতে পারেন ।

ধারণাগতভাবে আপনি এমন একটি শ্রেণীর একটি ধারণা প্রস্তাব করছেন যা "জনপ্রিয় বিষয় হতে পারে" এমন একটি শ্রেণীর ধারণা যা থেকে আপনার তিন প্রকারের স্থান অধিকার করে। আপনি একটি টেবিল নামক এই প্রতিনিধিত্ব করতে পারে, উদাহরণস্বরূপ, placesযেখানে প্রতিটি সারির একটি সারিতে সঙ্গে একটি একের সাথে এক সম্পর্ক রয়েছে regions, countriesঅথবা states। (অঞ্চল, দেশ বা রাজ্যের মধ্যে ভাগ করা বৈশিষ্ট্য, যদি কোনও হয় তবে এই জায়গাগুলির সারণিতে ঠেলাঠেলি করা যেতে পারে)) আপনার স্থানগুলি সারণীর popular_place_idএকটি সারিতে বিদেশী কী উল্লেখ হবে যা আপনাকে পরে একটি অঞ্চল, দেশ নিয়ে যাবে you , বা রাষ্ট্র।

অ্যাসোসিয়েশনের ধরণের বর্ণনা দেওয়ার জন্য আপনি দ্বিতীয় কলামের সাথে যে সমাধানটি প্রস্তাব করেছেন সেটি হ'ল রেলগুলি পলিমারফিক সংঘগুলি কীভাবে পরিচালনা করে তবে আমি সাধারণভাবে এর কোন অনুরাগী নই। বহুত্বপূর্ণ সমিতি কেন আপনার বন্ধু হয় না তা বিলটি বিশদভাবে ব্যাখ্যা করে।


1
ওরফে "সুপার টাইপ-সাব টাইপ প্যাটার্ন"
এরিক

এছাড়াও এই নিবন্ধটি ধারণাটি ভালভাবে ব্যাখ্যা করেছেন ডুহেলোগ্রিগ্রেইগিক
মার্কো স্টাফোলি

5

বিল কারভিনের "সুপার টেবিল" পদ্ধতির সংশোধন এখানে দেওয়া হয়েছে ( place_type, place_id ), অনুমিত স্বাভাবিক ফর্ম লঙ্ঘনগুলি সমাধান করার জন্য একটি যৌগিক কী ব্যবহার করে :

CREATE TABLE places (
  place_id INT NOT NULL UNIQUE,
  place_type VARCHAR(10) NOT NULL
     CHECK ( place_type = 'state', 'country' ),
  UNIQUE ( place_type, place_id )
);

CREATE TABLE states (
  place_id INT NOT NULL UNIQUE,
  place_type VARCHAR(10) DEFAULT 'state' NOT NULL
     CHECK ( place_type = 'state' ),
  FOREIGN KEY ( place_type, place_id ) 
     REFERENCES places ( place_type, place_id )
  -- attributes specific to states go here
);

CREATE TABLE countries (
  place_id INT NOT NULL UNIQUE,
  place_type VARCHAR(10) DEFAULT 'country' NOT NULL
     CHECK ( place_type = 'country' ),
  FOREIGN KEY ( place_type, place_id ) 
     REFERENCES places ( place_type, place_id )
  -- attributes specific to country go here
);

CREATE TABLE popular_areas (
  user_id INT NOT NULL,
  place_id INT NOT NULL,
  UNIQUE ( user_id, place_id ),
  FOREIGN KEY ( place_type, place_id ) 
     REFERENCES places ( place_type, place_id )
);

এই নকশাটি কী তা নিশ্চিত করতে পারে না যে প্রতিটি সারির জন্য placesসেখানে একটি সারি রয়েছে statesবা countries(তবে উভয়ই নয়)। এটি এসকিউএল-এ বিদেশী কীগুলির সীমাবদ্ধতা। একটি সম্পূর্ণ এসকিউএল -২২ স্ট্যান্ডার্ডের অনুবর্তী ডিবিএমএসে আপনি মুলতুবি আন্তঃ-সারণি সীমাবদ্ধতাগুলি সংজ্ঞায়িত করতে পারেন যা আপনাকে একই অর্জন করতে দেয় তবে এটি আড়ম্বরপূর্ণ, লেনদেনের সাথে জড়িত এবং এই জাতীয় ডিবিএমএস এখনও এটি বাজারে আনতে পারেনি।


0

আমি বুঝতে পারি যে এই থ্রেডটি পুরানো, তবে আমি এটি দেখেছিলাম এবং একটি সমাধান মনে আসল এবং আমি ভেবেছিলাম আমি এটি এখান থেকে ফেলে দেব।

অঞ্চল, দেশ এবং রাজ্যগুলি ভৌগলিক অবস্থান যা একটি শ্রেণিবিন্যাসে বাস করে।

আপনি তিনটি সারি (অঞ্চল, দেশ, রাজ্য) দ্বারা জনবহুল হিসাবে ভৌগলিক_লোকেশন_ টাইপ নামে একটি ডোমেন টেবিল তৈরি করে আপনি সম্পূর্ণরূপে আপনার সমস্যা এড়াতে পারবেন।

এরপরে, তিনটি অবস্থানের টেবিলের পরিবর্তে, একটি একক ভৌগলিক_স্থানীয় সারণী তৈরি করুন যা ভৌগলিক_লোকেশন_টাইপ_আইডির একটি বিদেশী কী রয়েছে (যাতে আপনি জানেন যে উদাহরণটি কোনও অঞ্চল, দেশ বা রাজ্য কিনা)।

এই টেবিলটিকে স্ব-রেফারেন্সিং করে হায়ারার্কির মডেল করুন যাতে কোনও রাজ্য উদাহরণ এফকেকে তার পিতৃ দেশ উদাহরণ হিসাবে ধরে রাখে যা ফলস্বরূপ এফকেকে তার পৈত্রিক অঞ্চলের উদাহরণ হিসাবে ধরে রাখে। অঞ্চলের দৃষ্টান্তগুলি সেই এফকেতে নুলকে ধরে রাখবে hold আপনি তিনটি টেবিল (যা আপনার 1 হবে - অঞ্চল এবং দেশ এবং দেশ এবং রাষ্ট্রের মধ্যে অনেক সম্পর্ক) নিয়ে যা করেছেন তার চেয়ে আলাদা নয়, এখনই এটি সমস্ত টেবিলে রয়েছে।

জনপ্রিয়_ ব্যবহারকারীর_ অবস্থানের টেবিলটি ব্যবহারকারী এবং জর্জিগ্রাফিকাল_লোকেশনের মধ্যে একটি স্কোপ রেজুলেশন টেবিল হবে (যাতে অনেক ব্যবহারকারী অনেক জায়গাতেই পছন্দ করতে পারেন)।

সুও…

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

CREATE TABLE [geographical_location_type] (
    [geographical_location_type_id] INTEGER NOT NULL,
    [name] VARCHAR(25) NOT NULL,
    CONSTRAINT [PK_geographical_location_type] PRIMARY KEY ([geographical_location_type_id])
)

-- Add 'Region', 'Country' and 'State' instances to the above table


CREATE TABLE [geographical_location] (
   [geographical_location_id] BIGINT IDENTITY(0,1) NOT NULL,
    [name] VARCHAR(1024) NOT NULL,
    [geographical_location_type_id] INTEGER NOT NULL,
    [geographical_location_parent] BIGINT,  -- self referencing; can be null for top-level instances
    CONSTRAINT [PK_geographical_location] PRIMARY KEY ([geographical_location_id])
)

CREATE TABLE [user] (
    [user_id] BIGINT NOT NULL,
    [login_id] VARCHAR(30) NOT NULL,
    [password] VARCHAR(512) NOT NULL,
    CONSTRAINT [PK_user] PRIMARY KEY ([user_id])
)


CREATE TABLE [popular_user_location] (
    [popular_user_location_id] BIGINT NOT NULL,
    [user_id] BIGINT NOT NULL,
    [geographical_location_id] BIGINT NOT NULL,
    CONSTRAINT [PK_popular_user_location] PRIMARY KEY ([popular_user_location_id])
)

ALTER TABLE [geographical_location] ADD CONSTRAINT [geographical_location_type_geographical_location] 
    FOREIGN KEY ([geographical_location_type_id]) REFERENCES [geographical_location_type] ([geographical_location_type_id])



ALTER TABLE [geographical_location] ADD CONSTRAINT [geographical_location_geographical_location] 
    FOREIGN KEY ([geographical_location_parent]) REFERENCES [geographical_location] ([geographical_location_id])



ALTER TABLE [popular_user_location] ADD CONSTRAINT [user_popular_user_location] 
    FOREIGN KEY ([user_id]) REFERENCES [user] ([user_id])



ALTER TABLE [popular_user_location] ADD CONSTRAINT [geographical_location_popular_user_location] 
    FOREIGN KEY ([geographical_location_id]) REFERENCES [geographical_location] ([geographical_location_id])

টার্গেট ডিবি কী তা নিশ্চিত ছিল না; উপরেরটি এমএস এসকিউএল সার্ভার।


0

ঠিক আছে, আমার কাছে দুটি টেবিল রয়েছে:

  1. গান

ক) গানের নম্বর খ) গানের শিরোনাম ....

  1. প্লেলিস্ট ক) প্লেলিস্ট নম্বর খ) প্লেলিস্ট শিরোনাম ...

এবং আমার একটি তৃতীয় আছে

  1. songs_to_playlist_relation

সমস্যাটি হ'ল কিছু ধরণের প্লেলিস্টের অন্য প্লেলিস্টগুলির সাথে লিঙ্ক রয়েছে। তবে মাইএসকিএলে আমাদের কাছে বিদেশী কী নেই যা দুটি টেবিলের সাথে জড়িত।

আমার সমাধান: আমি গানের_পরে_প্লেলিস্ট_লেলেশনে তৃতীয় কলাম রাখব। সেই কলামটি বুলিয়ান হবে। যদি 1 হয় তবে গান, অন্য কোনও প্লেলিস্ট টেবিলের সাথে লিঙ্ক করবে।

তাই:

  1. songs_to_playlist_relation

ক) প্লেলিস্ট_নম্বার (ইন্টি) খ) গান কি (বুলিয়ান) গ) আপেক্ষিক নম্বর (গানের নম্বর বা প্লেলিস্ট নম্বর) (ইনট) ( কোনও টেবিলে বিদেশী কী নয় )

 # টেবিলের গান তৈরি করুন 
    প্রশ্নগুলি পরিশেষে যোগ ( "তে সেট SQL_MODE = NO_AUTO_VALUE_ON_ZERO;" ) 
    প্রশ্নের সংযোজন ( "টেবিল তৈরি করুন songs( NUMBERint (11) নাল SONG POSITIONনয়, PLAY SONGঅন্ত (11) নাল নয়, টিনিনেন্ট (1) নন ডিফল্ট '1', SONG TITLEভারচার (255) অক্ষর সেট utf8 কল করুন utf8_ জেনারাল_সি নয় ন্যূনতম, বর্ণচালিকা DESCRIPTION(1000) বর্ণমালা কল করুন utf8_ জেনারাল_সিই নাল, কালচার ARTIST(255) চরিত্র সেট utf8 কলম্বিত না হয় 'Άγνωστος καλλιτέχνης', বর্ণচর AUTHOR(255) চরিত্রটি সেট করুন utf8 ক্লাসেট ইউটিউইচআর -২০১ DE খালি নং -২০১ COMPOSERNOT নয় ডিফল্ট 'Άγνωστος συνθέτης',ALBUMবর্ণচর (255) চরিত্র সেট করুন utf8 কল করুন utf8_ জেনারাল_সি নয় অবশ্যই 'Άγνωστο άλμπουμ', YEARINT (11) নয় '33' খালি, বার (11) নয় খালি RATING'5', IMAGEবর্ণচর (600) চরিত্রটি খণ্ড খণ্ড খণ্ড খণ্ডন 8 , SONG PATHবর্ণচালক (500) চার্টারের সেট utf8 কল করুন utf8_ জেনারেল_সি নয় নয়, SONG REPEATint (11) নন ডিফল্ট '0' VOLUMEনয় , ভাসা নল ডিফল্ট '1', SPEEDভাসা নট ডিফল্ট '1' নয়) ENGINE = InnoDB DEFULT CHARTT =; 8 ) ; 
    প্রশ্নের পরিশেষে যোগ ( ) অনন্য কী যোগ করুন, ( ,) অনন্য কী যোগ ( );") 
    জিজ্ঞাসা( "বিকল্প টেবিল songsপ্রাথমিক কী (ADD NUMBER), অনন্য কী যোগPOSITIONSONG POSITIONTITLESONG TITLEPATHSONG PATHসংযোজন ( " songsটেবিলের মোডেফাইয়ের পূর্বে NUMBER(11) স্বতঃশক্তি না;" )

#create table playlists
queries.append("CREATE TABLE `playlists` (`NUMBER` int(11) NOT NULL,`PLAYLIST POSITION` int(11) NOT NULL,`PLAYLIST TITLE` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,`PLAYLIST PATH` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;")
queries.append("ALTER TABLE `playlists` ADD PRIMARY KEY (`NUMBER`),ADD UNIQUE KEY `POSITION` (`PLAYLIST POSITION`),ADD UNIQUE KEY `TITLE` (`PLAYLIST TITLE`),ADD UNIQUE KEY `PATH` (`PLAYLIST PATH`);")
queries.append("ALTER TABLE `playlists` MODIFY `NUMBER` int(11) NOT NULL AUTO_INCREMENT;")

#create table for songs to playlist relation
queries.append("CREATE TABLE `songs of playlist` (`PLAYLIST NUMBER` int(11) NOT NULL,`SONG OR PLAYLIST` tinyint(1) NOT NULL DEFAULT '1',`RELATIVE NUMBER` int(11) NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;")
queries.append("ALTER TABLE `songs of playlist` ADD KEY `PLAYLIST NUMBER` (`PLAYLIST NUMBER`) USING BTREE;")
queries.append("ALTER TABLE `songs of playlist` ADD CONSTRAINT `playlist of playlist_ibfk_1` FOREIGN KEY (`PLAYLIST NUMBER`) REFERENCES `playlists` (`NUMBER`) ON DELETE RESTRICT ON UPDATE RESTRICT")

এখানেই শেষ!

প্লেলিস্ট_কোয়ারি = "নির্বাচন করুন এস 1। *, এস 3। *, এস 4। * এস 1 ইনার জয়েন play প্লেলিস্টের গান হিসাবে এস 2 ও এস 1 টিতে নম্বর হিসাবে এস -3.`০`.`RELATIVE নম্বর অন্তর্গত যোগদান করুন` প্লেলিস্টগুলিতে এস 3 ও এস 3 হিসাবে .`NUMBER` = s2.` প্লেলিস্ট নম্বর` অন্তর্ভুক্ত হয়ে যোগ করুন `প্লেলিস্টগুলিতে এস 4 হিসাবে s4.`NUMBER s = s2.`RELATIVE নম্বর অর্ডার দ্বারা s3.` প্লেলিস্ট পজিশন,` s1`.`সং পজিশন` "
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.