মাইএসকিউএল এফকে জন্য উপযুক্ত নামকরণ কনভেনশন কী?


উত্তর:


145

মাইএসকিউএলে বিদেশী কী বাধাগুলির জন্য একটি প্রতীকী নাম দেওয়ার দরকার নেই। যদি কোনও নাম না দেওয়া হয়, তবে InnoDB স্বয়ংক্রিয়ভাবে একটি অনন্য নাম তৈরি করে।

যাই হোক না কেন, এটি আমি ব্যবহার করি এমন কনভেনশন:

fk_[referencing table name]_[referenced table name]_[referencing field name]

উদাহরণ:

CREATE TABLE users(
    user_id    int,
    name       varchar(100)
);

CREATE TABLE messages(
    message_id int,
    user_id    int
);

ALTER TABLE messages ADD CONSTRAINT fk_messages_users_user_id 
    FOREIGN KEY (user_id) REFERENCES users(user_id);

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

এই নামকরণ কনভেনশনটি আমাকে কেবল সারণির সংজ্ঞাগুলি দেখে প্রতীকী নামটি "অনুমান" করতে দেয় এবং তদতিরিক্ত এটি অনন্য নামেরও গ্যারান্টি দেয়।


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

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

4
1 টির বেশি বিদেশী কী থাকলে কী হবে? উদাহরণ: member_id~> টেবিল সদস্যের edited_idলিঙ্ক, user> সম্পাদিত ব্যবহারকারীর জন্য বিদেশী কী, টেবিল সদস্যের সাথেও লিঙ্ক। আমি কীভাবে তাদের নাম রাখব?
টমসোয়ায়ার

@ টমসওয়ায়ার: আমি সমস্ত বিদেশী কীগুলিতে 'pk_' যুক্ত করি, তারপরে রেফারেন্স সারণী (যেমন 'সদস্য') পরে ব্যবহার / ধারণা (উদাহরণস্বরূপ 'সম্পাদক' বা 'লেখক') যুক্ত হয়। সুতরাং আমার কাছে 'পিকে_ মেম্বারস_অ্যাটর' বা 'পিকে_মেম্বারস_এডিটর' এর মতো কিছু আছে।
নিরগিজার

28

আমার পছন্দ আলাদা। আমার মতে, একটি টেবিলের একটি idক্ষেত্র থাকতে হবে, একটি নয় user_id, কারণ সারণী সবেমাত্র বলা হয়েছে user, তাই:

CREATE TABLE users(
   id    int,
   name       varchar(100)
);

CREATE TABLE messages(
   id int,
   user_id    int
);

user_idমধ্যে messagesতাই এটা স্পষ্ট, যা আইডি কি করতে হয়েছে টেবিল একটি FK ক্ষেত্র ( user_id)।

আমার মতে একটি সম্পূর্ণ স্ব-ব্যাখ্যাকারী নামকরণ কনভেনশন হতে পারে:

fk_[referencing table name]_[referencing field name]_[referenced table name]_[referenced field name]

i.e.: `fk_messages_user_id_users_id`

বিঃদ্রঃ:

  • আপনি কিছু ক্ষেত্রে দ্বিতীয় উপাদান বাদ দিতে পারেন ([ক্ষেত্রের নাম উল্লেখ করে])
  • এই এফকে অনন্য হতে পারে, কারণ যদি কোনও messages_userসারণি বিদ্যমান থাকে তবে রেফারেন্সিং ফিল্ডের নামটি user_id(এবং কেবল নয় id) হওয়া উচিত এবং এফকে নামটি হওয়া উচিত:

    fk_messages_user_user_id_users_id

অন্য কথায়, একটি বিদেশী কী নামকরণ কনভেনশন আপনাকে "রেফারেন্সিং / রেফারেন্সিং ফিল্ড" নামকরণের কনভেনশন ব্যবহার করলে (এবং আপনি অবশ্যই নিজের পছন্দটি বেছে নিতে পারেন) অনন্য নাম সম্পর্কে নিশ্চিত হন।


4
নামগুলিতে কোড জুড়ে চলার একটি উপায় রয়েছে have অবশেষে, আপনি $idকোথাও কোনও ভেরিয়েবল পাবেন যা কোনও টেবিলের সাথে সম্পর্কিত তা ধারণা ছাড়াই। আপনার কোড বেসটি যত বেশি পুরানো এবং এতে লোকেরা যত বেশি কাজ করেছে, এটি তত বেশি সম্ভাবনাময়।
সিজে ডেনিস

9

যদি আপনি নিজেকে এফ কে এর উল্লেখ করে খুঁজে না পান যা তারা তৈরির পরে প্রায়শই করে থাকে তবে একটি বিকল্প হ'ল এটি সহজ রাখা এবং মাইএসকিউএলকে আপনার জন্য নামকরণ করতে দেওয়া (যেমন ড্যানিয়েল ভ্যাসালো তাঁর উত্তরের শুরুতে উল্লেখ করেছেন )।

আপনি এই পদ্ধতির সাথে প্রতিবন্ধকতার নামগুলি অনন্যভাবে "অনুমান" করতে সক্ষম হবেন না - আপনি সহজেই একটি ক্যোয়ারী চালিয়ে বিদেশী কী সীমাবদ্ধতার নামটি খুঁজে পেতে পারেন:

use information_schema;
select TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME from KEY_COLUMN_USAGE where REFERENCED_TABLE_SCHEMA = 'your_db_schema_name' ORDER BY TABLE_NAME;

উদাহরণস্বরূপ আপনি কোয়েরি থেকে নিম্নলিখিতটি পেতে পারেন:

+------------+-------------+-----------------+-----------------------+------------------------+
| TABLE_NAME | COLUMN_NAME | CONSTRAINT_NAME | REFERENCED_TABLE_NAME | REFERENCED_COLUMN_NAME |
+------------+-------------+-----------------+-----------------------+------------------------+
| note       | taskid      | note_ibfk_2     | task                  | id                     |
| note       | userid      | note_ibfk_1     | user                  | id                     |
| task       | userid      | task_ibfk_1     | user                  | id                     |
+------------+-------------+-----------------+-----------------------+------------------------+

যদি এই অতিরিক্ত পদক্ষেপটি আপনার পক্ষে খুব বেশি না হয়, তবে আপনার সন্ধান করা fk সহজেই সন্ধান করা উচিত।


1
fk-[referencing_table]-[referencing_field]

কারণটির সংমিশ্রণ referencing_table এবং referencing_fieldএকটি ডাটাবেসের মধ্যে অনন্য। এই উপায়ে বিদেশী কী নামটি পড়া সহজ করে তোলে উদাহরণস্বরূপ:

table `user`:
    id
    name
    role

table `article`:
    id
    content
    created_user_id /* --> user.id */
    reviewed_user_id /* --> user.id */

সুতরাং আমাদের দুটি বিদেশী কী রয়েছে:

fk-article-created_user_id
fk-article-reviewed_user_id

userবিদেশী কী নামে টেবিলের নাম যুক্ত করা হ্রাসকারী।


ডাটাবেসের নাম যদি হয় user_role? userএবং roleবহুমানুষের সম্পর্ক রয়েছে এবং user_roleএটি এমন টেবিল যা সমস্ত বিদেশী কী রয়েছে। এটা করা উচিত fk_user_role_role?
Nguyễn Đức Tâm

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