এই "ম্যাপিং" টেবিলের জন্য আমার কি আলাদা আইডি কলাম দরকার?


10

আমার একটি টেবিল Producersএবং একটি টেবিল রয়েছে Products, যা উভয়ই ফর্মের:

  • Id - int, প্রাথমিক কী
  • Name - nvachar

একজন প্রযোজক একাধিক পণ্য বহন করতে পারে, তাই আমি একটি টেবিল তৈরি করতে যাচ্ছিলাম যার নাম ProducerDetailsথাকবে:

  • ProducerId - int, বিদেশী কী Producers.Id
  • ProductId - int, বিদেশী কী Products.Id

তারপরে আমি নিজেই প্রশ্ন করা শুরু করি, তাই আমি ভেবেছিলাম বিশেষজ্ঞদের জিজ্ঞাসা করব। Idআমার ProducerDetailsটেবিলে একটি অতিরিক্ত (int, প্রাথমিক কী) কলাম থাকা আরও ভাল ডাটাবেস ডিজাইন হতে পারে ? নাকি তা অপ্রয়োজনীয়?

আমি এসকিউএল-সার্ভার 2008 আর 2 ব্যবহার করছি যদি এতে কোনও পার্থক্য হয়।

সম্পাদনা - এই টেবিলগুলির মধ্যে সম্পর্ক অনেকের মধ্যেই হবে আমার বিশ্বাস, দুঃখিত আমি এটি পরিষ্কার করেছিলাম না। একজন প্রযোজক একাধিক ধরণের পণ্য বহন করতে পারে এবং একই পণ্য একাধিক বিভিন্ন উত্পাদক উত্পাদন করতে পারে।

আমি ক্ষমা চাইছি যদি এই প্রশ্নটি অত্যধিক সহজ হয় তবে রেফারেন্সিয়াল অখণ্ডতা / ডাটাবেস ডিজাইনটি আমার শক্তিশালী না (যদিও আমি এটি উন্নত করার চেষ্টা করছি)।

উত্তর:


6

যদি আপনার প্রযোজক এবং পণ্যগুলির মধ্যে একের মধ্যে একাধিক সম্পর্ক থাকে (অন্য কথায়, কোনও পণ্য কেবলমাত্র একজন উত্পাদকের অন্তর্ভুক্ত হতে পারে), কেবল আপনার Productsটেবিলের মধ্যে সরাসরি কোনও বিদেশী কী রেফারেন্স স্থাপন করা বুদ্ধিমান হতে পারে :

এক থেকে অনেক

create table Producer
(
    id int identity(1, 1) not null primary key clustered,
    Name varchar(100) not null
)
go

create table Product
(
    id int identity(1, 1) not null,
    Name varchar(100) not null,
    ProducerId int not null foreign key references Producer(id)
)
go

তবে যদি এটির সুযোগ থাকে যে এটি একটি বহু-বহু সম্পর্কের হয়ে থাকে, তবে আপনার সেরা বেটটি একটি যোগদানের টেবিলটি ব্যবহার করা হবে।

অনেক সাথে অধিকের

create table Producer
(
    id int identity(1, 1) not null primary key clustered,
    Name varchar(100) not null
)
go

create table Product
(
    id int identity(1, 1) not null primary key clustered,
    Name varchar(100) not null
)
go

create table ProductProducer
(
    ProductId int not null foreign key references Product(id),
    ProducerId int not null foreign key references Producer(id)
)
go

-- adding the primary key also ensures uniqueness
alter table ProductProducer
add constraint PK_ProductProducer 
primary key (ProductId, ProducerId)
go

আপনি যদি যোগদানের টেবিলটি নিয়ে যাওয়ার সিদ্ধান্ত নেন তবে আপনার অতিরিক্ত কী লাগবে না, কারণ এর সংমিশ্রণটি ProductId/ProducerIdশেষ পর্যন্ত অনন্য হয়ে উঠবে। আপনি এগুলি একটি সংমিশ্রিত কী হিসাবে ব্যবহার করতে পারেন, সুতরাং আপনার অতিরিক্ত Idক্ষেত্রের প্রয়োজন হবে না ProductProducer


1
আপনি যদিও আসল প্রশ্নের উত্তর দিচ্ছেন না - তিনি জিজ্ঞাসা idকরছেন তার সম্পর্কের টেবিলে কোনও ক্ষেত্র থাকার কোনও মূল্য আছে কি?
জেএনকে

@ জেএনকে আমি আমার প্রশ্ন সম্পাদনা করেছি। যদি ProductId, ProducerIdকোনও অনন্য সমন্বয় হয় তবে আমি যোগদানের টেবিলে আর একটি কৃত্রিম কী যুক্ত করার প্রয়োজন দেখছি না। একমত? এবং আমি মনে করি, যতক্ষণ না আমি প্রশ্নটি ভুল বুঝেছি ততক্ষণ পর্যন্ত ওপিকে এই ব্যবহারের ক্ষেত্রে একটি যোগদানের টেবিল ব্যবহার করার দরকার নেই।
থমাস স্ট্রিংগার

@ jadarnel27 ঠিক আছে, স্পষ্টির জন্য আপনাকে ধন্যবাদ। আমি আমার উত্তরের সেই অংশটি অতিক্রম করেছি (যদিও আমি মনে করি এটি আরও রেফারেন্সের জন্য কিছু পদক্ষেপ নেওয়া বুদ্ধিমান)।
থমাস স্ট্রিংগার

7

না, এই টেবিলটিতে অতিরিক্ত "প্রাথমিক কী" যুক্ত করার কোনও মূল্য নেই। আপনার যোগদানগুলি কেবল সর্বদা উল্লেখ করতে চলেছে ProducerIDএবং ProductIDতাই এটি কেবল মৃত ওজন। এই প্রোগ্রামটিতে।

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

অন্যদিকে, আমি আপনার প্রাথমিক সনাক্তকারী পুরো (যেমন Products.ProductIDপরিবর্তে পরিবর্তে Products.ID) নামকরণ করা সার্থক বলে মনে করি যাতে স্ক্রিমায় সনাক্তকারীটির ধারাবাহিকভাবে নাম রাখা যায়।


@ jadarnel27: অন্যান্য সমস্ত কলামের জন্য, হ্যাঁ, এটি খারাপ অভ্যাস হিসাবে বিবেচিত হয়। পিকে কলামের জন্য, অনেকে এই স্টাইল ( ProductID) ব্যবহার করতে পছন্দ করেন । একটি সুবিধা হ'ল আপনি যখন কোনওটি দেখেন SometableID, ততক্ষণে আপনি তা জানতে পারবেন যে এটি কোন টেবিলটিকে বোঝায়। আরেকটি হ'ল আপনি Product JOIN ProducerDetail USING(ProductID)দীর্ঘসূত্রের পরিবর্তে বাক্য Product JOIN ProducerDetail ON Product.ID = ProducerDetail.ProductID
গঠনটি

দুঃখিত, আমি মনে করি এটি USING(ProductID)এসকিউএল-সার্ভারে উপলভ্য নয়, সুতরাং সেই বিন্দুটি প্রয়োগ হয় না।
ypercubeᵀᴹ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.