আপনার কর্মী ব্যবস্থাপনা (Employee Management) মডিউলের জন্য একটি মাল্টি-কোম্পানি ভিত্তিক এবং ফিচার সমৃদ্ধ ডেটাবেজ ডিজাইন এখানে প্রস্তাব করা হলো। এই ডিজাইনে প্রতিটি কর্মীর রেকর্ড একটি নির্দিষ্ট কোম্পানির সাথে সংযুক্ত থাকবে, এবং এতে অতিরিক্ত বিভিন্ন ফিচার যুক্ত থাকবে যা কর্মী ব্যবস্থাপনাকে আরও কার্যকর এবং তথ্যবহুল করবে।
Employee Management Database Design
প্রধান টেবিলসমূহ এবং ফিল্ড
- employees (প্রধান টেবিল, যেখানে কর্মীর মূল তথ্য থাকবে)
- employee_contact_details (কর্মীর যোগাযোগ সম্পর্কিত তথ্য)
- employee_emergency_contacts (জরুরি যোগাযোগের তথ্য)
- employee_job_details (কর্মীর পদের বিবরণ, যোগদানের তারিখ, এবং কাজের স্থান)
- employee_salary_details (কর্মীর বেতন সম্পর্কিত তথ্য)
- employee_documents (কর্মীর নথি সংরক্ষণ)
- employee_dependents (কর্মীর নির্ভরশীল ব্যক্তির তথ্য)
- employee_bank_details (কর্মীর ব্যাংক তথ্য)
- employee_work_history (কর্মীর পূর্ববর্তী চাকরির তথ্য)
- employee_status_log (কর্মীর কর্মসংস্থান অবস্থা পরিবর্তন লগ)
1. employees
| Field Name | Data Type | Description |
|---|---|---|
| employee_id | INT (PK) | কর্মীর আইডি (প্রাথমিক কী) |
| company_id | INT (FK) | কোম্পানির আইডি (যার সাথে কর্মী যুক্ত) |
| first_name | VARCHAR(50) | কর্মীর প্রথম নাম |
| last_name | VARCHAR(50) | কর্মীর শেষ নাম |
| gender | ENUM | লিঙ্গ (Male, Female, Other) |
| date_of_birth | DATE | জন্ম তারিখ |
| marital_status | ENUM | বৈবাহিক অবস্থা (Single, Married, etc.) |
| nationality | VARCHAR(50) | জাতীয়তা |
| employee_code | VARCHAR(20) | কর্মীর কোড (ইউনিক আইডেন্টিফায়ার) |
| employment_type | ENUM | চাকরির ধরণ (Permanent, Contract, etc.) |
| created_at | TIMESTAMP | তৈরি করার তারিখ |
| updated_at | TIMESTAMP | আপডেট করার তারিখ |
| status | ENUM | কর্মী অবস্থা (Active, Inactive, Terminated) |
রিলেশন: employees টেবিলের company_id ফিল্ডটি Company টেবিলের সাথে সংযুক্ত থাকবে, যা নিশ্চিত করবে যে প্রতিটি কর্মী একটি নির্দিষ্ট কোম্পানির অধীনে রয়েছে। এই টেবিলটি Employee Management মডিউলের প্রধান টেবিল হিসেবে কাজ করবে, এবং বাকি টেবিলগুলো employee_id ফিল্ডের মাধ্যমে এই টেবিলের সাথে সম্পর্কিত থাকবে।
2. employee_contact_details
| Field Name | Data Type | Description |
|---|---|---|
| contact_id | INT (PK) | যোগাযোগ তথ্যের আইডি |
| employee_id | INT (FK) | কর্মীর আইডি |
| phone_number | VARCHAR(15) | কর্মীর ফোন নম্বর |
| VARCHAR(100) | কর্মীর ইমেইল | |
| address | TEXT | ঠিকানা |
| city | VARCHAR(50) | শহর |
| state | VARCHAR(50) | রাজ্য |
| postal_code | VARCHAR(10) | পিন কোড |
| country | VARCHAR(50) | দেশ |
| created_at | TIMESTAMP | তৈরি করার তারিখ |
| updated_at | TIMESTAMP | আপডেট করার তারিখ |
employee_id ফিল্ডটি employees টেবিলের সাথে সংযুক্ত থাকবে, যা নিশ্চিত করবে যে প্রতিটি যোগাযোগের তথ্য সঠিক কর্মীর সাথে সম্পর্কিত রয়েছে। এখানে employee_id হল Foreign Key, যা প্রত্যেক কর্মীর প্রাথমিক তথ্য ধরে রাখবে।3. employee_emergency_contacts
| Field Name | Data Type | Description |
|---|---|---|
| emergency_contact_id | INT (PK) | জরুরি যোগাযোগের আইডি |
| employee_id | INT (FK) | কর্মীর আইডি |
| contact_name | VARCHAR(100) | জরুরি যোগাযোগের ব্যক্তির নাম |
| relationship | VARCHAR(50) | সম্পর্ক (Father, Mother, Friend, etc.) |
| phone_number | VARCHAR(15) | জরুরি ফোন নম্বর |
| alternate_phone | VARCHAR(15) | বিকল্প ফোন নম্বর |
| created_at | TIMESTAMP | তৈরি করার তারিখ |
| updated_at | TIMESTAMP | আপডেট করার তারিখ |
employee_id ফিল্ডটি employees টেবিলের সাথে সংযুক্ত থাকবে, যা প্রতিটি কর্মীর জরুরি যোগাযোগের তথ্যকে তার মূল রেকর্ডের সাথে সংযুক্ত রাখবে। এই টেবিলটি একাধিক জরুরি যোগাযোগের তথ্য সংরক্ষণ করতে পারে এবং প্রতিটি তথ্য একটি নির্দিষ্ট কর্মীর অধীনে থাকবে।4. employee_job_details
| Field Name | Data Type | Description |
|---|---|---|
| job_detail_id | INT (PK) | চাকরির বিস্তারিত আইডি |
| employee_id | INT (FK) | কর্মীর আইডি |
| department_id | INT (FK) | ডিপার্টমেন্ট আইডি |
| designation_id | INT (FK) | পদবী আইডি |
| join_date | DATE | যোগদানের তারিখ |
| location | VARCHAR(100) | কর্মক্ষেত্রের অবস্থান |
| reporting_manager | INT (FK) | রিপোর্টিং ম্যানেজার আইডি |
| employment_status | ENUM | কর্মসংস্থানের অবস্থা (Active, On Leave) |
| created_at | TIMESTAMP | তৈরি করার তারিখ |
| updated_at | TIMESTAMP | আপডেট করার তারিখ |
employee_id ফিল্ডটি employees টেবিলের সাথে সংযুক্ত থাকবে এবং department_id এবং designation_id ফিল্ডগুলো departments এবং designations টেবিলের সাথে সম্পর্কিত থাকবে, যা কর্মীর বিভাগ এবং পদবী সংরক্ষণ করে। এর ফলে প্রতিটি কর্মী নির্দিষ্ট পদের অধীনে কোন ডিপার্টমেন্টে কাজ করছেন তা নির্দিষ্ট হবে।5. employee_salary_details
| Field Name | Data Type | Description |
|---|---|---|
| salary_id | INT (PK) | বেতন তথ্যের আইডি |
| employee_id | INT (FK) | কর্মীর আইডি |
| base_salary | DECIMAL(10,2) | মূল বেতন |
| allowance | DECIMAL(10,2) | ভাতা |
| deductions | DECIMAL(10,2) | কাটা |
| net_salary | DECIMAL(10,2) | নেট বেতন |
| effective_date | DATE | কার্যকরী তারিখ |
| created_at | TIMESTAMP | তৈরি করার তারিখ |
| updated_at | TIMESTAMP | আপডেট করার তারিখ |
employee_id ফিল্ডটি employees টেবিলের সাথে সংযুক্ত থাকবে। এখানে কর্মীর বেতন কাঠামোর বিস্তারিত তথ্য থাকবে, এবং এটি effective_date ফিল্ডের মাধ্যমে প্রতিটি বেতন পরিবর্তনের তারিখ সংরক্ষণ করবে।6. employee_documents
| Field Name | Data Type | Description |
|---|---|---|
| document_id | INT (PK) | নথির আইডি |
| employee_id | INT (FK) | কর্মীর আইডি |
| document_type | VARCHAR(50) | নথির ধরণ (ID Proof, Address Proof, etc.) |
| document_url | TEXT | নথির অবস্থান (URL বা স্টোরেজ পাথ) |
| expiry_date | DATE | নথির মেয়াদ উত্তীর্ণের তারিখ |
| created_at | TIMESTAMP | তৈরি করার তারিখ |
| updated_at | TIMESTAMP | আপডেট করার তারিখ |
employee_id ফিল্ডটি employees টেবিলের সাথে সংযুক্ত থাকবে, যা নিশ্চিত করবে যে প্রতিটি ডকুমেন্ট নির্দিষ্ট কর্মীর সাথে সম্পর্কিত। প্রতিটি ডকুমেন্টের ধরন এবং মেয়াদ উত্তীর্ণের তারিখ আলাদাভাবে সংরক্ষণ করা হয়, এবং এটি কর্মী সম্পর্কিত নথির তথ্যকে ট্র্যাক করতে সহায়ক।7. employee_dependents
| Field Name | Data Type | Description |
|---|---|---|
| dependent_id | INT (PK) | নির্ভরশীলের আইডি |
| employee_id | INT (FK) | কর্মীর আইডি |
| dependent_name | VARCHAR(100) | নির্ভরশীল ব্যক্তির নাম |
| relationship | VARCHAR(50) | সম্পর্ক (Child, Spouse, etc.) |
| date_of_birth | DATE | নির্ভরশীলের জন্ম তারিখ |
| created_at | TIMESTAMP | তৈরি করার তারিখ |
| updated_at | TIMESTAMP | আপডেট করার তারিখ |
employee_id ফিল্ডটি employees টেবিলের সাথে সংযুক্ত থাকবে। এই টেবিলে কর্মীর নির্ভরশীল ব্যক্তিদের তথ্য সংরক্ষিত থাকবে যেমন তাদের নাম, সম্পর্ক এবং জন্ম তারিখ, যা প্রতিটি নির্ভরশীলকে সংশ্লিষ্ট কর্মীর সাথে যুক্ত রাখে।8. employee_bank_details
| Field Name | Data Type | Description |
|---|---|---|
| bank_detail_id | INT (PK) | ব্যাংক তথ্যের আইডি |
| employee_id | INT (FK) | কর্মীর আইডি |
| bank_name | VARCHAR(100) | ব্যাংকের নাম |
| account_number | VARCHAR(20) | ব্যাংক অ্যাকাউন্ট নম্বর |
| ifsc_code | VARCHAR(15) | IFSC কোড |
| branch_name | VARCHAR(50) | শাখার নাম |
| created_at | TIMESTAMP | তৈরি করার তারিখ |
| updated_at | TIMESTAMP | আপডেট করার তারিখ |
employee_id ফিল্ডটি employees টেবিলের সাথে সংযুক্ত থাকবে, যা প্রতিটি কর্মীর ব্যাংক তথ্য নিশ্চিত করবে। এতে ব্যাংক অ্যাকাউন্টের তথ্য, ব্যাংকের নাম এবং শাখার বিবরণ থাকে যা পে-রোল প্রসেসিংয়ে সহায়ক।9. employee_work_history
| Field Name | Data Type | Description |
|---|---|---|
| work_history_id | INT (PK) | কাজের ইতিহাসের আইডি |
| employee_id | INT (FK) | কর্মীর আইডি |
| company_name | VARCHAR(100) | পূর্ববর্তী কোম্পানির নাম |
| job_title | VARCHAR(100) | পূর্ববর্তী পদবী |
| start_date | DATE | কাজের শুরু তারিখ |
| end_date | DATE | কাজের শেষ তারিখ |
| description | TEXT | কাজের বিবরণ |
employee_id ফিল্ডটি employees টেবিলের সাথে সংযুক্ত থাকবে। এতে কর্মীর পূর্ববর্তী চাকরির তথ্য যেমন কোম্পানির নাম, পদবী, এবং কাজের সময়কাল সংরক্ষিত থাকবে, যা প্রতিটি কর্মীর কাজের অভিজ্ঞতা ট্র্যাক করার জন্য ব্যবহার করা হবে।10. employee_status_log
| Field Name | Data Type | Description |
|---|---|---|
| status_log_id | INT (PK) | অবস্থা লগের আইডি |
| employee_id | INT (FK) | কর্মীর আইডি |
| status | ENUM | অবস্থা (Active, Inactive, Terminated) |
| change_date | DATE | অবস্থা পরিবর্তনের তারিখ |
| remarks | TEXT | মন্তব্য |
| created_at | TIMESTAMP | তৈরি করার তারিখ |
employee_id ফিল্ডটি employees টেবিলের সাথে সংযুক্ত থাকবে। এই টেবিলটি কর্মীর চাকরির অবস্থা পরিবর্তনের লগ সংরক্ষণ করে, যেমন অবস্থা (Active, Inactive, Terminated) এবং পরিবর্তনের তারিখ।কোম্পানি টেবিল সব টেবিল এর সাথে সংযোগ থাকবে না কেন ?
যেহেতু প্রতিটি কর্মী employees টেবিলের মাধ্যমে নির্দিষ্ট একটি কোম্পানির সাথে যুক্ত থাকে, তাই অন্য টেবিলগুলোতে company_id যুক্ত করা আবশ্যক নয়। কারণ employees টেবিলে থাকা company_id ফিল্ড থেকেই সম্পর্কটি স্বয়ংক্রিয়ভাবে প্রতিটি সম্পর্কিত টেবিলে প্রয়োগ করা যায়।
এই রিলেশনাল মডেলে যখন employee_id এর মাধ্যমে অন্যান্য টেবিল থেকে তথ্য সংগ্রহ করা হবে, তখন employees টেবিলের company_id দ্বারা কোম্পানির সাথে সম্পর্কটি বজায় থাকবে। উদাহরণস্বরূপ, যদি employee_salary_details টেবিল থেকে তথ্য সংগ্রহ করতে হয়, তবে employee_id ব্যবহার করে employees টেবিলের company_id পাওয়া যাবে।
সারমর্ম
- অন্য টেবিলে
company_idযুক্ত করার প্রয়োজন নেই, কারণemployeesটেবিলেরcompany_idফিল্ডটি অন্যান্য টেবিলের তথ্যকে কোম্পানির সাথে সংযুক্ত করার জন্য যথেষ্ট। - ডেটাবেজ স্ট্রাকচার সহজ রাখার জন্য,
company_idশুধুমাত্রemployeesটেবিলে থাকা সঠিক, যা প্রতিটি টেবিলের সাথে সংযোগ বজায় রাখতে পারবে।
উদাহরণ
ধরে নিই, employee_documents টেবিল থেকে একটি কর্মীর ডকুমেন্ট তথ্য পেতে হবে এবং তার সাথে সংশ্লিষ্ট কোম্পানি জানতে হবে। তখন SQL কুয়েরি হবে:
SELECT e.company_id, d.document_type, d.document_url
FROM employee_documents d
JOIN employees e ON d.employee_id = e.employee_id
WHERE d.employee_id = [specific_employee_id];
এভাবে, company_id এর সরাসরি প্রয়োজন ছাড়াই কোম্পানির তথ্য সংগ্রহ করা যাবে।
সুতরাং, employees টেবিলের মাধ্যমে সম্পর্কটি বজায় রেখে অন্য টেবিলগুলোতে company_id যুক্ত করা প্রয়োজন নেই।