PDA

View Full Version : سوال: Comma seperated IDs در یک رکورد یا تکرار هر ID در یک رکورد مجزا



MehranZand
جمعه 07 اسفند 1388, 20:17 عصر
با سلام

دوستان بانکی را در نظر بگیرید که به سرعت تعداد رکوردهای یک جدول آن یه 100 میلیون و بیشتر خواهد رسید. یک رکورد از این جدول می تواند کلید خارجی به جدول دیگر داشته باشد که از 1 تا n عدد متغییر است (بطور متوسط 5 کلید خارجی در نظر بگیرید).
برای جلوگیری از افزونگی داده این کلید های خارجی بجای تکرار رکورد در یک فیلد یک رکورد و بصورت Comma Separated قرار داده میشوند. در این روش در هنگام بازیابی از تابعی برای Split کردن ابن فیلد و بدست آوردن ID ها استفاده میشود.
اگر دیتابیس ما 100 میلیون رکورد داشته باشد در این روش همان 100 میلیون رکورد باقی میماند در روش دیگر ( تکرار رکورد به ازای هر ID) این جدول تقریبا (با توجه به مقدار متوسط ذکر شده) 500 میلیون رکورد خواهد شد.

روش 1:

ID Name ForeignIDs
-- ------- ------------
1 Ali 40,41,42,43,44



روش 2:

ID Name ForeignID
-- ------- ------------
1 Ali 40
2 Ali 41
3 Ali 42
4 Ali 43
5 Ali 44



کدام روش هزینه کمتری دارد و مناسبتر است؟ لطفا دلیل خود را هم بفرمایید.

ممنون

محمد سلیم آبادی
جمعه 07 اسفند 1388, 21:11 عصر
سلام،
اگر داده ها به فرم 1 ذخیره شوند مشکل در ویرایش و حذف کلید های خارجی خواهید داشت.
اگر روش استاندارد می خواهید فرم 2 صحیح است. به فرم 2 داده ها را درج کنید و هنگام بازیابی آنها را Concatenating (الحاق سطرها) کنید.

MehranZand
جمعه 07 اسفند 1388, 21:29 عصر
ممنون از پاسخ شما.
مشکلی از نظر حذف و یا ویرایش وجود ندارد، بدلیل اینکه این جدول کلید های دیگری هم دارد که به واسطه آن حذف و یا ویرایش انجام میشود. من تنها بحثم در مورد cost یک کوئری با دو مدل ذکر شده میباشد. کدام بهتر است؟ اصولا در مراحل نرمال سازی داده یک از اصول نرم سازی استفاده از روش دوم است اما در این مورد هم همینطور است؟ در مثالی که ذکر کردم تفاوت این دو روش 400 میلیون رکورد است .

محمد سلیم آبادی
جمعه 07 اسفند 1388, 21:58 عصر
ID Name ForeignIDs
-- ------- ------------
1 Ali 40,41,42,43,44



اول از همه باید ایده، مورد چالش قرار گیرد تا عملکرد آن تایید شود سپس در مورد cost صحبت می کنند.
در مثالی که زدین فرض کنید قرار است مقادیر 40 و 42 حذف شوند و 41 به 80 ویرایش شود این کار را چگونه انجام می دهین؟
و بهتر نبود یک جدول دیگر برای ذخیره کردن اسامی در نظر می گرفتین و به جای استفاده از نام فرد کلید آن سطر از جدول را درج می کردین؟ چون اگر سطر مربوط به Ali حذف شود تمام مشخصات آن فرد از بین خواهد رفت. و این بر خلاف نرمالسازی جداول است.

MehranZand
شنبه 08 اسفند 1388, 08:07 صبح
ID Name ForeignIDs
-- ------- ------------
1 Ali 40,41,42,43,44

اول از همه باید ایده، مورد چالش قرار گیرد تا عملکرد آن تایید شود سپس در مورد cost صحبت می کنند.
در مثالی که زدین فرض کنید قرار است مقادیر 40 و 42 حذف شوند و 41 به 80 ویرایش شود این کار را چگونه انجام می دهین؟
و بهتر نبود یک جدول دیگر برای ذخیره کردن اسامی در نظر می گرفتین و به جای استفاده از نام فرد کلید آن سطر از جدول را درج می کردین؟ چون اگر سطر مربوط به Ali حذف شود تمام مشخصات آن فرد از بین خواهد رفت. و این بر خلاف نرمالسازی جداول است.



در پاسخ مثالی که شما ذکر کردید در مورد حذف و یا ویرایش باید یک مقدار بیشتر مسئله را توضیح دهم.

در اینجا ما حذف دسته ای از رکورد ها را انجام می دهیم و ویرایش هم به همین صورت.
یعنی به واسطه کلید خارجی دیگر که اصلاحا ImportLogID نام داردحذف و ویرایش دسته ای
انجام میشود .

Delete from mytable where ImportLogID = @ImportLogID

در مورد ویرایش هم به همین صورت است، برنامه کاربردی رشته ای از ID های جدید ساخته میشود و update انجام میشود بواسطه کلید ImportLogID


update mytable set ForeignIDs =@ForeignIDs where ImportLogID = @ImportLogID

من مثالی که از دو روش زدم بصورت کاملا ساده ذکر شده و هر فردی اطلاعاتش در جدولی دیگر درج میشود و همینطور که شما گفتید کلید آن در جدول اصلی قرار خواهد گرفت.

همینطور که در پست قبلی عرض کردم مسئله من در مورد هزینه بازیابی کوئری با این دو روش است.

محمد سلیم آبادی
یک شنبه 09 اسفند 1388, 10:27 صبح
چون داده ها به صورتی دسته ای ذخیره می شن طبیعتا به فرم یک ذخیره بشوند خیلی بهتر است. چون که در فرم دو برای هر گروه نیاز دارین تعداد زیادی سطر را برای هر کاربر درج کنید در صورتی که در فرم 1 تنها یک سطر درج می شود و همینطور برای حذف. از طرفی فضای کمتری را اشغال می کنند.