اسکریپت لیست جداول بدون ارتباط Loner Tables
اسکریپت لیست جداول بدون ارتباط در SQL Server، جدولهایی را شناسایی میکند که هیچ کلید خارجی ورودی یا خروجی ندارند.
اسکریپت لیست جداول بدون ارتباط (Loner Tables) در SQL Server
در پایگاه دادههای SQL Server، جداول مختلفی برای ذخیرهسازی اطلاعات ایجاد میشوند و معمولاً از طریق کلیدهای خارجی (Foreign Key) با یکدیگر ارتباط دارند.این ارتباطها به حفظ یکپارچگی دادهها کمک میکنند و باعث میشوند اطلاعات مرتبط در جداول مختلف بهدرستی مدیریت شوند.
بااینحال، در برخی دیتابیسها ممکن است جدولهایی وجود داشته باشند که هیچ ارتباطی با سایر جداول ندارند.
شناسایی این جدولها برای بررسی ساختار دیتابیس، مستندسازی و بهینهسازی طراحی پایگاه داده اهمیت دارد.
به جدولهایی که از طریق روابط تعریفشده در ساختار دیتابیس به جداول دیگر متصل نیستند، گاهی Loner Tables گفته میشود.
البته این اصطلاح یک عنوان عمومی است و تعریف دقیق آن به معیار بررسی بستگی دارد.
برای مثال، ممکن است جدولی هیچ کلید خارجی نداشته باشد، اما جدول دیگری به آن ارجاع داده باشد.
همچنین ممکن است جدولی هیچ ارتباطی از طریق کلیدهای خارجی نداشته باشد، ولی در کد برنامه یا رویههای ذخیرهشده استفاده شود.
🌟 آیا میخواهید به یک متخصص پایگاه داده تبدیل شوید و در دنیای فناوری اطلاعات بدرخشید؟با دوره آموزشی SQL Server ما، شما میتوانید به راحتی و با روشی عملی، تمام مهارتهای لازم را یاد بگیرید!این دوره به شما آموزش میدهد که چگونه دادهها را به بهترین شکل مدیریت کنید، گزارشهای قدرتمند بسازید و به تحلیلهای عمیق دست یابید.با محتوای جذاب و پروژههای واقعی، شما نه تنها تئوری را یاد میگیرید، بلکه تواناییهای عملی خود را نیز تقویت میکنید.پس فرصت را از دست ندهید! همین امروز به جمع یادگیرندگان ما بپیوندید و اولین قدم را به سوی آینده شغلی روشنتر بردارید!
منظور از جداول بدون ارتباط در SQL Server چیست؟
در SQL Server، ارتباط بین جداول معمولاً با استفاده از محدودیت Foreign Key تعریف میشود.این محدودیت مشخص میکند که مقادیر یک یا چند ستون در یک جدول باید با مقادیر کلید معتبر در جدول دیگری مطابقت داشته باشند.
برای مثال، فرض کنید دیتابیسی شامل سه جدول Customers، Orders و Products است. جدول Orders میتواند از طریق یک کلید خارجی به جدول Customers متصل باشد.
همچنین ممکن است جدول دیگری برای جزئیات سفارشها وجود داشته باشد که به Orders ارجاع دهد.
اگر جدولی مانند TemporaryLogs هیچ کلید خارجی نداشته باشد و هیچ جدول دیگری نیز از طریق Foreign Key به آن ارجاع ندهد، این جدول از نظر روابط تعریفشده در دیتابیس، مستقل محسوب میشود.
البته نبود ارتباط در ساختار Foreign Key الزاماً به معنای بلااستفاده بودن جدول نیست.
ممکن است اطلاعات آن از طریق کدهای برنامهنویسی، کوئریهای خاص یا فرآیندهای ETL مورد استفاده قرار گیرد.
اسکریپت لیست جداول بدون ارتباط
برای شناسایی جداول بدون ارتباط در SQL Server میتوان از اطلاعات موجود در کاتالوگ سیستمی دیتابیس استفاده کرد.نمای سیستمی sys.tables فهرست جدولهای کاربر را در اختیار قرار میدهد و sys.foreign_keys اطلاعات مربوط به کلیدهای خارجی تعریفشده را نگهداری میکند.
اسکریپت زیر جدولهایی را نمایش میدهد که هیچ کلید خارجی خروجی ندارند و هیچ کلید خارجی نیز از جدول دیگری به آنها اشاره نمیکند.
SELECT
SCHEMA_NAME(t.schema_id) AS SchemaName,
t.name AS TableName
FROM sys.tables AS t
WHERE
NOT EXISTS
(
SELECT 1
FROM sys.foreign_keys AS fk
WHERE fk.parent_object_id = t.object_id
)
AND NOT EXISTS
(
SELECT 1
FROM sys.foreign_keys AS fk
WHERE fk.referenced_object_id = t.object_id
)
ORDER BY
SchemaName,
TableName;
در این اسکریپت، ابتدا جدولهای کاربر از نمای سیستمی sys.tables دریافت میشوند.
سپس دو شرط بررسی میشود تا فقط جدولهایی در خروجی قرار بگیرند که هیچ ارتباطی از طریق Foreign Key ندارند.
شرط اول بررسی میکند که آیا جدول موردنظر دارای کلید خارجی خروجی است یا خیر.
شرط دوم مشخص میکند که آیا جدولهای دیگر به آن ارجاع دادهاند یا خیر.
استفاده از NOT EXISTS باعث میشود فقط جدولهایی انتخاب شوند که هیچ رکورد منطبق در اطلاعات کلیدهای خارجی ندارند.
در نهایت، نام اسکیمای هر جدول و نام خود جدول نمایش داده میشود.
مرتبسازی خروجی نیز براساس نام اسکیمـا و جدول انجام میگیرد تا بررسی نتایج آسانتر باشد.
بررسی ساختار اسکریپت لیست جداول بدون ارتباط
برای درک بهتر عملکرد کوئری، لازم است بخشهای مختلف آن را جداگانه بررسی کنیم.-
استفاده از sys.tables
نمای سیستمی sys.tables اطلاعات جدولهای کاربر در دیتابیس جاری را ارائه میدهد.
در این کوئری، هر جدول با نام مستعار t مشخص شده است تا در ادامه بتوان به ستونهای آن دسترسی داشت.
ستون object_id شناسه داخلی هر شیء در دیتابیس است.
این شناسه برای ارتباط دادن اطلاعات جدولها با سایر نماهای سیستمی مورد استفاده قرار میگیرد. -
بررسی کلیدهای خارجی خروجی
در بخش اول NOT EXISTS، ستون parent_object_id از نمای sys.foreign_keys بررسی میشود.
این ستون شناسه جدولی را مشخص میکند که کلید خارجی در آن تعریف شده است.
اگر جدولی دارای یک یا چند کلید خارجی باشد، شرط اول برقرار نخواهد بود و آن جدول از خروجی حذف میشود.
-
بررسی کلیدهای خارجی ورودی
در بخش دوم، ستون referenced_object_id بررسی میشود.
این ستون شناسه جدولی را مشخص میکند که کلید خارجی به آن ارجاع میدهد.
اگر جدول دیگری از طریق یک کلید خارجی به جدول موردنظر متصل باشد، شرط دوم برقرار نخواهد بود.
به همین دلیل، جدولهایی که مقصد ارتباطهای خارجی هستند نیز از خروجی حذف میشوند.
-
نمایش نام اسکیمـا و جدول
در SQL Server، نام جدول بهتنهایی همیشه برای شناسایی آن کافی نیست؛ زیرا ممکن است در اسکیمـاهای مختلف، جدولهایی با نام یکسان وجود داشته باشند.
به همین دلیل، استفاده از SCHEMA_NAME(t.schema_id) کمک میکند نام اسکیمای هر جدول نیز نمایش داده شود.
این موضوع هنگام بررسی دیتابیسهای بزرگ و مستندسازی ساختار آنها اهمیت دارد.
تفاوت جدول بدون کلید خارجی با جدول بدون ارتباط
یکی از نکات مهم در بررسی جداول مستقل، تفاوت میان جدولی است که کلید خارجی ندارد و جدولی که هیچ جدول دیگری نیز به آن ارجاع نمیدهد.برای مثال، فرض کنید جدول Categories دارای کلید خارجی نیست، اما جدول Products از طریق یک کلید خارجی به آن متصل شده است.
در این حالت، Categories کلید خارجی خروجی ندارد، ولی از نظر ارتباطهای تعریفشده در دیتابیس مستقل نیست.
اگر فقط نبود کلید خارجی خروجی بررسی شود، جدول Categories نیز در نتایج قرار میگیرد.
اما اسکریپت اصلی هر دو جهت ارتباط را بررسی میکند و چنین جدولی را نمایش نمیدهد.
این تفاوت برای شناسایی دقیقتر Loner Tables اهمیت دارد؛ زیرا هدف، پیدا کردن جدولهایی است که در هیچیک از روابط تعریفشده با Foreign Key شرکت ندارند.
کاربرد شناسایی جداول بدون ارتباط
شناسایی جداول بدون ارتباط میتواند در فرآیندهای مختلف مدیریت دیتابیس مفید باشد.یکی از مهمترین کاربردها، بررسی کیفیت طراحی پایگاه داده است.
اگر جدولهایی وجود داشته باشند که انتظار میرود با سایر جداول ارتباط داشته باشند، اما هیچ کلید خارجی برای آنها تعریف نشده باشد، ممکن است نیاز به بازبینی ساختار دیتابیس وجود داشته باشد.
کاربرد دیگر، مستندسازی دیتابیس است.
با شناسایی جدولهای مستقل میتوان بخشهایی از ساختار پایگاه داده را که ارتباط رسمی ندارند، سریعتر بررسی کرد.
همچنین هنگام انتقال اطلاعات از یک دیتابیس به دیتابیس دیگر، بررسی روابط بین جدولها اهمیت دارد.
جدولهای مستقل ممکن است برای انتقال یا بارگذاری اولیه اطلاعات، ترتیب متفاوتی نسبت به جدولهای وابسته داشته باشند؛ هرچند ترتیب واقعی انتقال باید براساس تمام وابستگیهای سیستم تعیین شود.
از طرف دیگر، این اسکریپت میتواند در بررسی دیتابیسهای قدیمی نیز مفید باشد.
گاهی پس از تغییر ساختار نرمافزار، جدولهایی باقی میمانند که دیگر در روابط رسمی دیتابیس حضور ندارند.
بااینحال، حذف چنین جدولهایی تنها براساس این نتیجه توصیه نمیشود؛ زیرا ممکن است برنامهها یا فرآیندهای دیگری همچنان از آنها استفاده کنند.
نکات مهم پیش از استفاده از اسکریپت
اسکریپت ارائهشده فقط روابطی را بررسی میکند که بهصورت Foreign Key در دیتابیس جاری تعریف شدهاند.
اگر ارتباط بین دو جدول صرفاً در کد برنامهنویسی یا از طریق نامگذاری ستونها مشخص شده باشد، این کوئری قادر به شناسایی آن نخواهد بود.
همچنین کوئری روی دیتابیسی اجرا میشود که در حال حاضر به آن متصل هستید.
بنابراین، پیش از اجرا باید مطمئن شوید دیتابیس موردنظر انتخاب شده است.
نکته دیگر اینکه جدولهای بدون ارتباط لزوماً غیرضروری نیستند.
برای مثال، جدولهای تنظیمات، گزارشهای مستقل، دادههای موقت و جدولهای واسط ممکن است بهصورت عمدی بدون کلید خارجی طراحی شده باشند.
در نتیجه، بهتر است خروجی این اسکریپت بهعنوان ابزاری برای بررسی ساختار دیتابیس استفاده شود، نه معیاری قطعی برای حذف جدولها یا تشخیص مشکلات طراحی.




کاربران ما
شما هم نظرتون با ما دریاره “اسکریپت لیست جداول بدون ارتباط Loner Tables” اشتراک بزارید
برای ارسال نظر لطفا ورود یا ثبت نام کنید