বহু-থেকে-বহু (জংশন) সারণীতে কি অনন্য আইডি কলামের প্রয়োজন?


22

ইএফ দিয়ে কয়েকটি প্রকল্প শুরু করা, তবে আমার যোগদানের টেবিল এবং কী ইত্যাদির বিষয়ে কিছু প্রশ্ন ছিল Le বলুন যে আমার কাছে অ্যাপ্লিকেশনের একটি টেবিল এবং অনুমতিগুলির একটি টেবিল রয়েছে। অ্যাপ্লিকেশনগুলির অনেক অনুমতি রয়েছে এবং প্রতিটি অনুমতি অনেকগুলি অ্যাপ্লিকেশনের (বহু থেকে বহু) অন্তর্ভুক্ত থাকতে পারে।

এখন, অ্যাপ্লিকেশন এবং অনুমতি সারণীগুলি সহজ:

Applications
--------------
PK  ApplicationID
    Name

Permissions
--------------
PK  PermissionID
    Name

তবে যোগদানের টেবিলটি করার সর্বোত্তম উপায় কী? আমার কাছে এই দুটি বিকল্প রয়েছে:

ApplicationPermissions
-----------------------
PK  ApplicationPermissionID
CU  ApplicationID
CU  PermissionID

অথবা

ApplicationPermissions
-----------------------
CPK ApplicationID
CPK PermissionID

PK = Primary Key
CPK = Composite Primary Key
CU = Composite Unique Index

আপনি কি কখনও অন্য উপায়ে এটি করে পোড়া হয়েছেন? এটা কি কঠোরভাবে পছন্দ? আমার কাছে এটি ঘটেছে যে প্রচুর "পার্থক্যগুলি" আমার সংগ্রহস্থল প্যাটার্ন দ্বারা বিমূর্ত হয়ে যাবে (উদাহরণস্বরূপ, আমি প্রায় কোনও সম্পূর্ণ অনুমতি অবজেক্ট তৈরি করতে এবং এটি একটি অ্যাপ্লিকেশনটিতে যুক্ত করতে চাই না, তবে এটি আইডি বা অনন্য নাম বা এটি দ্বারা করতে পারি বা কিছু), তবে আমি অনুমান করি যে আমি হরর গল্পগুলি খুঁজছি, এক উপায় বা অন্য।

উত্তর:


20

আমি বিশ্বাস করি আপনার অর্থ "জংশন" টেবিল, "যোগদান" সারণী নয়।

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

সুতরাং "সেরা" বিকল্পটি হল আইডি এড়ানো avoid সাধারণত একটি জংশন টেবিলের 2 টি কভারিং সূচক থাকবে। প্রতিটি প্রচ্ছদ সূচক ম্যাপ করা আইডিগুলির মধ্যে একটির প্রাথমিক সারণি ক্ষেত্র হিসাবে ব্যবহার করে।

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

যদি আপনার কাঠামোটি সমস্ত টেবিলগুলির একটি আইডি রাখতে চায় তবে তার জন্য যান। যদি আপনার দলের ডেটাবেস স্ট্যান্ডার্ডগুলি নির্দেশ করে তবে সমস্ত টেবিলের অবশ্যই একটি আইডি থাকতে হবে। যদি তা না হয় তবে তা এড়িয়ে চলুন।


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

4
"আপনাকে কখনই এ জাতীয় আইডিতে যোগ দিতে বা জিজ্ঞাসা করতে হবে না" - প্রযুক্তি পরিস্থিতিতে "কখনই নয়" বলার কারণেই এটি ঘটতে আমন্ত্রণ জানাচ্ছে। বলে যে, সেখানে হয় বার যখন আপনি যোগদানের করবে টেবিল যোগদানের (হ্যাঁ, আমি এটা একটি টেবিল "যোগদান করুন" একটি "মোড়" সারণী চেয়ে বেশি উল্লেখ করা শুনেছি) এখনও চতুর্থ টেবিলে কারণ যোগদান সত্ত্বা আসলে একটি হয় তাদের নিজস্ব ব্যবসায়িক বিষয়।
জেসি সি স্লিকার 21

4
@RobertHarvey। আইডি সত্তা জন্য ভাল অভ্যাস। তবে একটি জংশন অনেকগুলি সম্পর্কের জন্য বাস্তবায়নের বিশদ হিসাবে আরও বেশি, এটি কোনও নিজস্ব কোনও অধিকার নয়। তবে জেসি সি স্লাইডারটি উল্লেখ করে বলেছে যে কোনও জংশনকে ব্যবসায়িক সত্তা হিসাবে বিবেচনা করা যেতে পারে cases
মাইকে 30

1
"ডিস্কের জায়গার অপচয়" " - আমি মনে করি কিছু ইঞ্জিন (ইনোডিবি?) যদি আপনি নিজেই তৈরি না করেন তবে একটি (অভ্যন্তরীণ) প্রাথমিক কী তৈরি করুন - যাতে আপনি সম্ভবত এটি না রেখে ডিস্কের স্থান অর্জন করতে পারেন না।
অ্যালেক্স

@Alex। আপনি ম্যাপযুক্ত আইডিগুলিতে একটি যৌগিক পিকে রেখেছেন।
মাইকে 30

11

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

উদাহরণস্বরূপ, যদি কেউ আপনাকে কোনও ফাইল বা মেমরিতে বিভিন্ন সারণির (বা সেগুলির উল্লেখগুলি) কয়েকটি সারি সংরক্ষণ করতে বলে, উদাহরণস্বরূপ, লগিংয়ের উদ্দেশ্যে, আপনি খুব সহজেই জানেন যখন আপনি ঠিক জানেন যে আপনার ঠিক একটি সংরক্ষণ করতে হবে সারণির নাম এবং ঠিক একটি পূর্ণসংখ্যার আইডি, এবং আপনাকে কোনও "বিশেষ ক্ষেত্রে" মোকাবেলা করতে হবে না।

আর একটি জিনিস, আপনি যখন সম্মিলিত পিকেগুলি শুরু করেন, আপনি সম্ভবত কিছু সময় পরে সম্মিলিত বিদেশী কীগুলির প্রয়োজনের দিকে ঝুঁকবেন (যেহেতু আপনি এমন একটি পয়েন্টে আসতে পারেন যেখানে আপনি আপনার ApplicationPermissionsটেবিলে এফকে রেফার যুক্ত করতে চান )। তারপরে পরবর্তী প্রয়োজনীয়তাটি হ'ল এই এফকে অন্যান্য বৈশিষ্ট্য বা বিদেশী কীগুলির সাথে মিলিয়ে অনন্য হতে হবে - যার ফলে সামগ্রিকভাবে জটিলতা বাড়বে। বেশিরভাগ আধুনিক ডিবি সিস্টেমে হ্যান্ডেল করা সম্ভব নয় এমন কিছুই অবশ্যই না, তবে একটি অভিন্ন সমাধান প্রোগ্রামারদের জীবনকে অনেক সহজ করে তোলে।

এবং পরিশেষে, এর মতো একটি বিবৃতি SELECT ... FROM TABLE WHERE TableNameID IN (id1,id2,...)প্রাথমিক কী হিসাবে একটি একক কলামে ভাল কাজ করে, তবে আমি এখনও পর্যন্ত কোনও এসকিউএল উপভাষা দেখিনি যা আপনাকে সম্মিলিত কীগুলির সাহায্যে এটি করতে দেয়। আপনি যদি আগেই জানেন যে আপনার কখনই এর মতো কোনও কোয়ের দরকার হবে না, তবে কাল যদি আপনার এমন কোনও প্রয়োজনীয়তা পাওয়া যায় যা এই ধরণের এসকিউএল দিয়ে খুব সহজে সমাধান করা যায় তবে অবাক হবেন না।

অবশ্যই, আপনি যখন নিজের ApplicationPermissionsটেবিলটি কয়েকশ মিলিয়ন সারি ধরে রাখবেন এমন প্রত্যাশা করেন , তখন আপনার মতো একটি এড়াতে বিবেচনা করা উচিত ApplicationPermissionsID


যদিও আমি আপনার উত্তরটি বেছে নিই নি। আমি এর দিকগুলি পছন্দ করি আপনার চিন্তার জন্য ধন্যবাদ (upvote)
solidau

6

মাইকের উত্তরটি ভাল, আমি আলাদা আইডি ফিল্ড যুক্ত করব কিনা তা এখানে রয়েছে।

  1. জংশন / যোগদানের টেবিলের জন্য আলাদা আইডি ক্ষেত্রটি ব্যবহার করার বিষয়ে বিবেচনা করুন যদি এতে আইডি ব্যতীত অন্য ক্ষেত্র থাকে । এটি লক্ষ্য করে যে এটি প্রথম শ্রেণির সত্তা।

  2. যদি APIs বা কোনও বিদ্যমান যুক্তি সত্তা পুনরুদ্ধার / সম্পাদনা করার জন্য একক ক্ষেত্র ব্যবহার করতে থাকে তবে আলাদা আইডি ক্ষেত্রটি ব্যবহার করার বিষয়ে বিবেচনা করুন। এটি অন্য লোকেদের কোনও বৃহত প্রকল্পের প্রসঙ্গে আপনার কোড অনুসরণ করতে সহায়তা করতে পারে।

  3. নির্দিষ্ট সুবিধা (কেআইএসএস) না থাকলে এটি ব্যবহার করবেন না । EF জানে যে এই ধরণের টেবিলটি কীভাবে পরিচালনা করতে হয় এবং যখন অন্য ব্যক্তিরা এই ধরণের সম্পর্ক বোঝার চেষ্টা করছেন তখন কখনও কখনও একটি যৌথ অনন্য বাধাও এড়ানো যায় missed এছাড়াও, স্বাভাবিক করার সময় আমি সম্ভাব্যতম ক্ষুদ্রতম কীটি ব্যবহার করার চেষ্টা করি যা টিপলটিকে অনন্যভাবে সংজ্ঞায়িত করে । আপনার দ্বিতীয় উদাহরণে, আপনার কাছে কার্যকরভাবে দুটি পৃথক প্রার্থী প্রাথমিক কী রয়েছে।


-5
table Person
   Id int identity(1,1) not null primary key
   ...other fields go here...
table Address
   Id int identity(1,1) not null primary key
   ...other fields go here...
table PersonAddress
   Id int identity(1,1) not null primary key
   PersonId int not null
   AddressId int not null

উভয় PersonIdএবং তে একটি সূচক এবং বিদেশী কী তৈরি করতে মনে রাখবেন AddressId

অন্যেরা যা "ভাল" বা "আপনার উচিত" বলে মনে করেন তা বিবেচনা না করা, এটি ডাটাবেসটিকে সঠিকভাবে কাজ করার অনুমতি দেওয়ার সহজতম ও সহজ উপায়।


1
আমি মনে করি এই পদ্ধতির সাথে একটি সমস্যা হ'ল স্কিমাটি PersonAddressঅভিন্ন PersonIdএবং AddressIdমানগুলির সাথে দুটি সারিকে মঞ্জুরি দেয় ।
সাম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.