এগুলি অবশ্যই অনন্য হওয়া উচিত, আমার কোনও মাইএসকিউএল ডিবিতে এফকে কী নামকরণ করা উচিত?
উত্তর:
মাইএসকিউএলে বিদেশী কী বাধাগুলির জন্য একটি প্রতীকী নাম দেওয়ার দরকার নেই। যদি কোনও নাম না দেওয়া হয়, তবে 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
উপরের উদাহরণেযখন এটি ব্যবহারিক নয়, আমি রেফারেন্সযুক্ত ফিল্ডের নামটি বিদেশী কী নামের সাথে যুক্তও করি।
এই নামকরণ কনভেনশনটি আমাকে কেবল সারণির সংজ্ঞাগুলি দেখে প্রতীকী নামটি "অনুমান" করতে দেয় এবং তদতিরিক্ত এটি অনন্য নামেরও গ্যারান্টি দেয়।
member_id
~> টেবিল সদস্যের edited_id
লিঙ্ক, user> সম্পাদিত ব্যবহারকারীর জন্য বিদেশী কী, টেবিল সদস্যের সাথেও লিঙ্ক। আমি কীভাবে তাদের নাম রাখব?
আমার পছন্দ আলাদা। আমার মতে, একটি টেবিলের একটি 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
অন্য কথায়, একটি বিদেশী কী নামকরণ কনভেনশন আপনাকে "রেফারেন্সিং / রেফারেন্সিং ফিল্ড" নামকরণের কনভেনশন ব্যবহার করলে (এবং আপনি অবশ্যই নিজের পছন্দটি বেছে নিতে পারেন) অনন্য নাম সম্পর্কে নিশ্চিত হন।
$id
কোথাও কোনও ভেরিয়েবল পাবেন যা কোনও টেবিলের সাথে সম্পর্কিত তা ধারণা ছাড়াই। আপনার কোড বেসটি যত বেশি পুরানো এবং এতে লোকেরা যত বেশি কাজ করেছে, এটি তত বেশি সম্ভাবনাময়।
যদি আপনি নিজেকে এফ কে এর উল্লেখ করে খুঁজে না পান যা তারা তৈরির পরে প্রায়শই করে থাকে তবে একটি বিকল্প হ'ল এটি সহজ রাখা এবং মাইএসকিউএলকে আপনার জন্য নামকরণ করতে দেওয়া (যেমন ড্যানিয়েল ভ্যাসালো তাঁর উত্তরের শুরুতে উল্লেখ করেছেন )।
আপনি এই পদ্ধতির সাথে প্রতিবন্ধকতার নামগুলি অনন্যভাবে "অনুমান" করতে সক্ষম হবেন না - আপনি সহজেই একটি ক্যোয়ারী চালিয়ে বিদেশী কী সীমাবদ্ধতার নামটি খুঁজে পেতে পারেন:
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 সহজেই সন্ধান করা উচিত।
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
?