বিদেশী কী নামকরণ প্রকল্প


152

আমি কেবল প্রথমবারের জন্য বিদেশী কীগুলির সাথে কাজ শুরু করছি এবং আমি ভাবছি যে তাদের জন্য কোনও নামকরণের নামকরণের ব্যবহার আছে কিনা?

এই সারণী দেওয়া:

task (id, userid, title)
note (id, taskid, userid, note);
user (id, name)

যেখানে কার্যগুলিতে নোট রয়েছে, কার্যগুলি ব্যবহারকারী এবং ব্যবহারকারী লেখক নোটের মালিকানাধীন।

তিনটি বিদেশী কী কীভাবে এই পরিস্থিতিতে নামকরণ করা হবে? বা বিকল্পভাবে, এটি কি আদৌ কিছু যায় আসে ?

আপডেট : এই প্রশ্নটি ক্ষেত্রের নাম নয়, বিদেশী কী নামগুলি সম্পর্কে!


6
পাঠকদের জন্য নোট: নীচে তালিকাভুক্ত সেরা কয়েকটি অনুশীলন 30 টি চরিত্রের নাম সীমাবদ্ধতার কারণে ওরাকলে কাজ করে না। কোনও টেবিলের নাম বা কলামের নাম ইতিমধ্যে 30 টি অক্ষরের কাছাকাছি থাকতে পারে, সুতরাং দুটিকে একক নামের সাথে সংমিশ্রিত একটি কনভেনশনটির একটি কাটা স্ট্যান্ডার্ড বা অন্যান্য কৌশল প্রয়োজন।
চার্লস বার্নস

উত্তর:


179

এসকিউএল সার্ভারের মানক কনভেনশনটি হ'ল:

FK_ForeignKeyTable_PrimaryKeyTable

সুতরাং, উদাহরণস্বরূপ, নোট এবং কার্যগুলির মধ্যে কীটি হ'ল:

FK_note_task

এবং কার্য এবং ব্যবহারকারীদের মধ্যে কী হ'ল:

FK_task_user

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

FK_task_user
FK_note_task
FK_note_user

সুতরাং আপনি দেখতে পাচ্ছেন যে কার্যগুলি ব্যবহারকারীদের উপর নির্ভর করে এবং নোটগুলি উভয় কার্য এবং ব্যবহারকারীদের উপর নির্ভর করে।


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

4
আপনি পৃথক রাখতে কীতে বর্তমান সারণীর নাম অন্তর্ভুক্ত করুন। এসকিউএল সার্ভারে এফকে নামগুলি বিশ্বব্যাপী নেমস্পেসে রয়েছে যাতে আপনার দুটি পৃথক বিদেশী কী টেবিলের সাথে FK_PrimaryKeyTable নামের দুটি FK থাকতে পারে না। অন্যান্য ডাটাবেস সার্ভারগুলির জন্য নিয়মগুলি পৃথক হতে পারে।
গ্রেগ বিচ

ঠিক আছে ... ওরাকলে প্রতিটি টেবিলের জন্য আমার আলাদা আলাদা নেমস্পেস রয়েছে, তাই আমার স্ব-রেফারেন্সের দরকার নেই।
স্টিভ মায়ার

29
এটি সাধারণ ব্যবহার বলে মনে হয় তবে একই টেবিলের দিকে ইশারা করে যখন দুটি বিদেশী কী থাকে তখন লোকেরা কী করবে। অর্থাত messageটেবিলের একটি রয়েছে from_user_idএবং to_user_idসেগুলি উভয়ই হয়ে উঠবে fk_message_userfk_tablename_columnnameএই কারণে (আমার উদাহরণে fk_message_from_user_id) ব্যবহার করা আমার কাছে আরও ভাল বলে মনে হচ্ছে এবং তারপরে আপনার কলামের নামগুলি লক্ষ্য টেবিলটি সম্পর্কে পরিষ্কার রাখার চেষ্টা করুন (অর্থাত্__ ব্যবহারকারী_আইডি স্পষ্টভাবে ব্যবহারকারী সারণির উল্লেখ করছে)
কোড কমান্ডার

যদি উভয় টেবিলের নিজেই প্রাক্তনের জন্য আন্ডারস্কোর থাকে। ইউজার_রোল এবং ইউজার_ড্রেস? fk_user_address_user_rol কি বিভ্রান্তিকর নয়?
গভী এস

38

আমি ডিলিমিটার হিসাবে দুটি আন্ডারস্কোর অক্ষর ব্যবহার করি

fk__ForeignKeyTable__PrimaryKeyTable 

এটি কারণ টেবিলের নামগুলি মাঝে মধ্যে নিজেরাই আন্ডারস্কোর অক্ষর ধারণ করে। এটি সাধারণত সীমাবদ্ধতার জন্য নামকরণের সম্মেলন অনুসরণ করে কারণ ডেটা উপাদানগুলির নামগুলিতে প্রায়শই আন্ডারস্কোর অক্ষর থাকে eg

CREATE TABLE NaturalPersons (
   ...
   person_death_date DATETIME, 
   person_death_reason VARCHAR(30) 
      CONSTRAINT person_death_reason__not_zero_length
         CHECK (DATALENGTH(person_death_reason) > 0), 
   CONSTRAINT person_death_date__person_death_reason__interaction
      CHECK ((person_death_date IS NULL AND person_death_reason IS NULL)
              OR (person_death_date IS NOT NULL AND person_death_reason IS NOT NULL))
        ...

3
এটি একেবারে সেরা উত্তর।
ফ্রেডেরিক ক্রাউটওয়াল্ড

1
আমি খুব নির্দিষ্ট নামকরণ কনভেনশন সহ ডার্বি ডিবি তৈরি করেছি এবং এটি এখানে সর্বাধিক পঠনযোগ্য এবং সন্ধানযোগ্য। আপনাকে ধন্যবাদ
অ্যান্ডডো

17

কীভাবে FK_TABLENAME_COLUMNNAME?

কে EEP আমি টি এস imple এস tupid যখনই সম্ভব।


20
কারণ যখন আপনার কাছে প্রচুর কী এবং টেবিল সহ বিশাল ডিবি রয়েছে এবং আপনি যখন আপনার সফ্টওয়্যারটিতে একটি স্কিমা আপডেটের সময় ত্রুটি পান এটি কোনও ডেটাবেস তৈরি স্ক্রিপ্ট না করে বিদেশী কী এমনকি সংজ্ঞায়িত করা সন্ধান করা বেশ কঠিন।
জনসি

1
@ জোহনসি যদি এফকে কলামের নামগুলির কলামের নামটিতে অন্য টেবিলের নাম থাকে তবে এটি জানা খুব সহজ হওয়া উচিত নয়? এটি আপনাকে দুটি সারণী এবং কলামের নামটি এতে সংজ্ঞায়িত করেছে। উদা: FK_Animals_OwnerIDnনিমালস এবং মালিকদের সারণী, মালিকের কলামে সংজ্ঞায়িত
ডেভিড শেরেট

10

এসকিউএল সার্ভার সম্পর্কিত মাইক্রোসফ্টের একটি নোট:

একটি বিদেশী মূল সীমাবদ্ধতা কেবলমাত্র অন্য টেবিলে একটি প্রাথমিক কী বাধা যুক্ত হতে হবে না; এটি অন্য সারণীতে একটি অনন্য বাধার কলামগুলি উল্লেখ করতে সংজ্ঞায়িত করা যেতে পারে।

সুতরাং, আমি প্রচলিত প্রাথমিক / বিদেশী সম্পর্কের শর্তগুলির পরিবর্তে নির্ভরতা বর্ণনা করার শর্তাদি ব্যবহার করব।

নির্ভরশীল (শিশু) সারণীতে অনুরূপ নামযুক্ত কলাম (গুলি) দ্বারা স্বাধীন (পিতামাতার) সারণীর প্রাথমিক কী উল্লেখ করার সময় , আমি কলামের নাম (গুলি) বাদ দিই:

FK_ChildTable_ParentTable

অন্যান্য কলামগুলি উল্লেখ করার সময়, বা কলামের নাম দুটি সারণীর মধ্যে পৃথক হয় বা কেবল স্পষ্টভাবে বলা যায়:

FK_ChildTable_childColumn_ParentTable_parentColumn

9

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

task (id, userid, title);
note (id, taskid, userid, note);
user (id, name);

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


হি - এটি হুবহু শৈলী যা আমি আসলে ব্যবহার করছি (তবে উট কেস সহ) - আমি ভেবেছিলাম তাদের লিঙ্কগুলি বোঝানোর উদ্দেশ্যে আমি নামগুলিতে কিছুটা অতিরিক্ত বিবরণ যুক্ত করব।
নিকফ

সুতরাং কমপক্ষে আমরা একে অপরের স্কিমাগুলি পড়তে পারি;) ... যা বুদ্ধিমান হয় তা কয়েক বছরের অনুপস্থিতির পরে আপনার নিজের পড়তে সক্ষম হয় না। আমরা আমাদের স্কিমাগুলি ডায়াগ্রামে ERWin ব্যবহার করি তবে এটি প্রায়শই একটি পাঠ্য সংস্করণ এবং কনভেনশন থাকা আপনার সুবিধামত টেবিল এবং ক্ষেত্রগুলি সন্ধান করতে সুবিধাজনক।
স্টিভ ময়র

5

এটি সম্ভবত ওভার-কিল, তবে এটি আমার পক্ষে কার্যকর। আমি বিশেষত ভিএলডিবিগুলির সাথে যখন ডিল করি তখন এটি আমাকে অনেক বেশি সহায়তা করে। আমি নিম্নলিখিত ব্যবহার:

CONSTRAINT [FK_ChildTableName_ChildColName_ParentTableName_PrimaryKeyColName]

অবশ্যই যদি কোনও কারণে আপনি একটি প্রাথমিক কী উল্লেখ করেন না তবে আপনাকে অবশ্যই এই ক্ষেত্রে একটি অনন্য বাধা থাকা কলামটি উল্লেখ করতে হবে:

CONSTRAINT [FK_ChildTableName_ChildColumnName_ParentTableName_ColumnInUniqueConstaintName]

হ্যাঁ, এটি দীর্ঘ হতে পারে? এটি কি প্রতিবেদনের জন্য তথ্য পরিষ্কার রাখতে সহায়তা করেছে বা সম্ভাব্য সমস্যাটি যখন একটি সতর্কতা অবলম্বনের সময় ঘটে তখন আমাকে এই দ্রুত নামিয়ে আনতে 100% এই নামকরণ সম্মেলনে মানুষের চিন্তাভাবনা জানতে আগ্রহী হবে।


1

আমার স্বাভাবিক পন্থা হয়

FK_ColumnNameOfForeignKey_TableNameOfReference_ColumnNameOfReference

বা অন্য পদে

FK_ChildColumnName_ParentTableName_ParentColumnName

এই পদ্ধতি আমি দুই বিদেশী কী একটি মত একই টেবিল রেফারেন্স যে নাম করতে history_info tableসঙ্গে column actionBy and actionToথেকে users_infoটেবিল

ভালো লাগবে

FK_actionBy_usersInfo_name - For actionBy
FK_actionTo_usersInfo_name - For actionTo

মনে রাখবেন যে:

আমি সন্তানের টেবিলের নামটি অন্তর্ভুক্ত করি নি কারণ এটি আমার কাছে সাধারণ জ্ঞান বলে মনে হয়, আমি সন্তানের টেবিলে থাকি যাতে আমি সহজেই সন্তানের টেবিলের নামটি ধরে নিতে পারি। এর মোট চরিত্রটি 26 এবং এটি চার্চ বার্নস এখানে একটি মন্তব্যে জানিয়েছিলেন ওরাকলের 30 টি চরিত্রের সীমাতে ভাল ফিট করে

পাঠকদের জন্য নোট: নীচে তালিকাভুক্ত সেরা কয়েকটি অনুশীলন 30 টি চরিত্রের নাম সীমাবদ্ধতার কারণে ওরাকলে কাজ করে না। কোনও টেবিলের নাম বা কলামের নাম ইতিমধ্যে 30 টি অক্ষরের কাছাকাছি থাকতে পারে, সুতরাং দুটিকে একক নামের সাথে সংমিশ্রিত একটি কনভেনশনটির একটি কাটা স্ট্যান্ডার্ড বা অন্যান্য কৌশল প্রয়োজন। - চার্লস বার্নস


আপনার তৃতীয় টেবিলে যদি প্যারেন্টটিবেলনাম_প্যারেন্টকালামনেমকে একই টেবিলের সদৃশ FK_Name
টনি ডং

0

এখানে উত্তর এবং মন্তব্যের ভিত্তিতে একটি নামকরণ কনভেনশন যা এফকে টেবিল, এফকে ক্ষেত্র এবং পিকে টেবিল (এফকে_এফকেটিবিএল_এফকে কল_পিটিবিএল) অন্তর্ভুক্ত করে এফকে সীমাবদ্ধতার নাম সংঘর্ষগুলি এড়ানো উচিত।

সুতরাং, এখানে প্রদত্ত টেবিলগুলির জন্য:

fk_task_userid_user
fk_note_userid_user

সুতরাং, যদি আপনি কোনও টাস্ক বা নোটকে সর্বশেষ পরিবর্তন করেছেন তা ট্র্যাক করতে যদি কোনও কলাম যুক্ত করেন ...

fk_task_modifiedby_user
fk_note_modifiedby_user

-2

আপনি যদি আপনার এফকে এর প্রায়শই উল্লেখ না করে এবং মাইএসকিউএল (এবং ইনোডিবি) ব্যবহার না করে থাকেন তবে আপনি কেবল মাইএসকিউএলকে আপনার জন্য এফকে নাম রাখতে দিতে পারেন।

পরবর্তী সময়ে আপনি কোয়েরি চালিয়ে আপনার প্রয়োজনীয় এফকে নামটি খুঁজে পেতে পারেন ।


4
আমি কেবল আমার ডাউন-ভোটের ব্যাখ্যা দিতে পারি। প্রতিটি ডাটাবেস সিস্টেমই সিস্টেমটিকে প্রতিবন্ধকতাগুলির নাম দেওয়ার অনুমতি দেয়, আপনি কী কোনও প্রোডাক্ট ইস্যু করার সময় ফিরে গিয়ে খুব তাড়াতাড়ি বের করার চেষ্টা করতে পারবেন / 100 টেবিল ডাটাবেস এমনকি এফকে__123ee456ff এর সাথে সম্পর্ক কী তা বোঝার চেষ্টা করছেন? এটি সাধারণ এবং সহজভাবে একটি হরিবল অনুশীলন করা। আপনি যখন এই এফকে তে একটি সূচক তৈরি করেন তখন কী? সিস্টেমের নামও কি? সুতরাং যখন সূচক IX_007e373f5963 98% খণ্ডিত হয় আপনি কীভাবে জানতে পারবেন কেন কোথায় খুঁজে বের করবেন? এটি করা উচিত নয়।
SSISPissesMeOff

-3

'-' (ড্যাশ) এর পরিবর্তে এফকে এবং '_' (আন্ডারস্কোর) দ্বারা প্রতিস্থাপিত প্রথম অক্টেটের সাথে আপার-কেসড সংস্করণ 4 ইউআইডি ব্যবহার করার চেষ্টা করুন।

যেমন

  • FK_4VPO_K4S2_A6M1_RQLEYLT1VQYV
  • FK_1786_45A6_A17C_F158C0FB343E
  • FK_45A5_4CFA_84B0_E18906927B53

যুক্তি নীচে দেওয়া হয়

  • কঠোর প্রজন্মের অ্যালগরিদম => অভিন্ন নাম ;
  • মূল দৈর্ঘ্য 30 টিরও কম অক্ষরের , যা ওরাকলে (12 সি এর আগে) দৈর্ঘ্যের সীমাবদ্ধতার নামকরণ করছে;
  • যদি আপনার সত্তার নাম পরিবর্তন হয় তবে আপনাকে সত্ত্বা-নাম ভিত্তিক পদ্ধতির মতো আপনার এফকে পুনরায় নামকরণের প্রয়োজন হবে না (যদি ডিবি টেবিলের নাম অপারেটরকে সমর্থন করে);
  • কেউ খুব কমই বিদেশী কী বাধার নাম ব্যবহার করবে। উদাহরণস্বরূপ, ডিবি সরঞ্জাম সাধারণত সীমাবদ্ধতার জন্য প্রযোজ্য তা দেখায়। ক্রিপ্টিক চেহারা থেকে ভয় পাওয়ার দরকার নেই, কারণ আপনি এটি "ডিক্রিপশন" এর জন্য ব্যবহার এড়াতে পারবেন।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.