PDA

View Full Version : راهنمایی در طراحی دیتابیس با FileTable



lvl3hdi
چهارشنبه 17 خرداد 1396, 23:09 عصر
سلام
من میخوام یه برنامه برای شرکتمون بنویسم متاسفانه تجربه استفاده از FileStream ندارم
یه سوال داشتم
تعداد فایلهای من خیلی زیاده ، تقریبا بالای 6 میلیون عکس اسکن شده
مشکل حجم طبیعتا با هارد درست میشه
مشکل من اینه نمیخوام با زیاد شدن تعداد اطلاعات جداولم برنامه کند عمل کنه
یکی از دوستان گفتن که میشه بعد یه تعداد ای دی یه جدول دیگه تعریف کرد ، بنظرتون این عملیه و کار میده ؟
یا اصلا نیازه به دو تا جدول ؟ یدونه جدول طراحی کنم بنظتون جواب میده ؟

ممنون میشم اگه ایده و طرحی دارین که بنظر خوب میاد بگین

sajadsobh
پنج شنبه 08 تیر 1396, 21:57 عصر
خب چرا میخواین اصن فایل رو داخل دیتابیس ذخیره کنید؟ آدرس فایل رو ذخیره کنید تا مشکل کندی دیتابیس پیش نیاد

alireza_s_84
جمعه 09 تیر 1396, 01:58 صبح
سلام
من میخوام یه برنامه برای شرکتمون بنویسم متاسفانه تجربه استفاده از FileTable یا FileStream ندارم
یه سوال داشتم
تعداد فایلهای من خیلی زیاده ، تقریبا بالای 3 میلیون عکس اسکن شده
مشکل حجم طبیعتا با هارد درست میشه
مشکل من اینه نمیخوام با زیاد شدن تعداد اطلاعات جداولم برنامه کند عمل کنه
یکی از دوستان گفتن که میشه بعد یه تعداد ای دی یه جدول دیگه تعریف کرد ، بنظرتون این عملیه و کار میده ؟
یا اصلا نیازه به دو تا جدول ؟ یدونه جدول طراحی کنم بنظتون جواب میده ؟

ممنون میشم اگه ایده و طرحی دارین که بنظر خوب میاد بگین
ابتدا اینکه استفاده از FileTable هیچ اثر منفی روی پایگاه داده شما نمیذاره. چون مبنای اون FileStream و مدیریت یکپارچه با فایل سیستم هست. یعنی بر خلاف ذخیره مستقیم فایل در جدول که مدیریتش با پایگاه داده است.
خب 3 میلیون عکس حجم بزرگی میشه که همه روی یک هارددیسک قابل ذخیره نیست و شما میتونید پایگاه داده رو روی چندین هارددیسک پارتیشن کنید. بهتره جداول اصلی رو توی یک هارد و FileTable رو توی هاردهای مختلف پارتیشن کنید.

alireza_s_84
جمعه 09 تیر 1396, 01:59 صبح
خب چرا میخواین اصن فایل رو داخل دیتابیس ذخیره کنید؟ آدرس فایل رو ذخیره کنید تا مشکل کندی دیتابیس پیش نیاد
استفاده از FileTable هیچ اثر منفی روی عملکرد پایگاه داده نمیذاره. دوران ذخیره فایل خارج از پایگاه داده و ذخیره آدرس اون در پایگاه داده گذشته!

lvl3hdi
شنبه 10 تیر 1396, 15:36 عصر
خیلی ممنون بابت پاسخ گوییتون

لینک فایل تصویر (دیتابیس تو یه سیستم دیگست اینو الان نوشتم کامل نیست ولی فیلدهای اصلی مشخصه) : http://uupload.ir/files/csme_untitled.jpg
دوتا جدولایی که طراحی کردم به این صورته که یکیش مربوطه به اطلاعات مراجعه میشه - فیلدهاش (آی دی ، آی دی دانشجو، مشخصات تصویر ، تاریخ شروع ، تاریخ پایان ، آی دی جدول تصویر)
فیلدهای جدول تصویر یا همون فایل تیبل (آی دی جدول تصویر ، استریم آی دی ، لینک عکس و ...)

همون طور که فرمودین واسه جدول دوم (جدول تصویر) یه فایل گروه دیگه مشخص شده که تو یه هارد دیگه ذخیره میشه

الان چند تا سوال :
1- میتونم آی دی جدول تصویر رو حذف کنم و با آی دی استریم کار کنم ؟ تاثیری تو سرعت سلکت داره ؟
یا همین طوری بمونه بهتره ؟

2 - کوئری هایی که نوشته میشه بیشتر جستجوها بر اساس آی دی دانشجو و تاریخ ورود و تاریخ خروج صورت میگیره - این سه تا رو باید ایندکس گذاری کرد ؟ (در مورد ایندکس گذاری اطلاعات کمی دارم ممنون میشم ایندکسای این دو تا جدول رو مشخص و نحوه ایندکس گذاریشونو بگین)
البته بعضی وقتا هم نیازه بر اساس آی دی دانشجو و مشخصات تصویر(جدول جدا با فیلدهای : آی دی - نام تصویر) جستجو شن

3- حجم عکسا در حدود دو مگ و تعداد بالای 6 م ... : برای این حجم تصویر شکستن جدول تصویر و دو تا کردن اون تاثیر داره ؟
چون تصاویر کاملا منظم و به ترتیب شماره هستند ، اینطوری داخل برنامه میشه تعریف کرد از یه شماره تا یه شماره خاص تو جدول 1 جستجو شن و بقیش تو یه جدول دیگه ، اینطوری سرعت گذارش گیری بهتر میشه بنطرتون ؟

بقیه دوستان هم مشارکت کنن لطفا (مارو از نظراتون به بهره نذارین :-x)

alireza_s_84
شنبه 10 تیر 1396, 18:59 عصر
میتونم آی دی جدول تصویر رو حذف کنم و با آی دی استریم کار کنم ؟ تاثیری تو سرعت سلکت داره ؟
سرعت کلیدهای int نسبت به Guid بیشتره، همیشه توصیه میشه کلید اصلی رو Guid نگیریم. از اونجا که Stream Id از نوع Guid هست پس همون Identity بهتر هست.



کوئری هایی که نوشته میشه بیشتر جستجوها بر اساس آی دی دانشجو و تاریخ ورود و تاریخ خروج صورت میگیره - این سه تا رو باید ایندکس گذاری کرد ؟ (در مورد ایندکس گذاری اطلاعات کمی دارم ممنون میشم ایندکسای این دو تا جدول رو مشخص و نحوه ایندکس گذاریشونو بگین)
البته بعضی وقتا هم نیازه بر اساس آی دی دانشجو و مشخصات تصویر(جدول جدا با فیلدهای : آی دی - نام تصویر) جستجو شن
کلیدهای اصلی که ایندکس خوشه‌ای هستن، منتها در سوال شما تاریخ ورود و تاریخ خروج باید ایندکس بشن. اگر سرعت خیلی بالایی مدنظرتون هست بهتر از Intersection Index استفاده کنید. یعنی روی هر ستون جداگونه ایندکس بزنید.
در مورد جدول دوم هم نام تصویر رو میتونید ایندکس گذاری کنید. هرچند لزومی نداره بر اساس نام تصویر جستجویی صورت بگیره. هرچند اطلاعی از سناریوی شما ندارم.


حجم عکسا در حدود دو مگ و تعداد بالای 6 م ... : برای این حجم تصویر شکستن جدول تصویر و دو تا کردن اون تاثیر داره ؟
چون تصاویر کاملا منظم و به ترتیب شماره هستند ، اینطوری داخل برنامه میشه تعریف کرد از یه شماره تا یه شماره خاص تو جدول 1 جستجو شن و بقیش تو یه جدول دیگه ، اینطوری سرعت گذارش گیری بهتر میشه بنطرتون ؟
نیازی به اینکار نیست. چون رکوردها بصورت درخت متوازن با مرتبه جستجوی O(log n) هست و بهترین حالت رو برای جستجو داره. اما برای افزایش کارایی بهتره جدول رو روی چند پارتیشن تقسیم کنید (یک درایو برای کل هارد در نظر نگیرید) و اگر روی چند هارد تقسیم بشه بی شک سرعت بالاتری خواهد داشت چون جستجو بصورت موازی انجام میشه (چند هد و پلاتر همزمان کار میکنن)

رامین مرادی
یک شنبه 11 تیر 1396, 10:26 صبح
منم چندبار خواستم کار با فایل تیبل رو یاد بگیرم تایپیک هم زدم. کاش دوستان یه راهنمایی برا افراد مبتدی مثل من هم بکنن که چطور میشه با فایل تیبل کار کرد . البته با یک مثل ساده ممنون میشم یادمون بدید:ناراحت:

lvl3hdi
چهارشنبه 14 تیر 1396, 09:50 صبح
سرعت کلیدهای int نسبت به Guid بیشتره، همیشه توصیه میشه کلید اصلی رو Guid نگیریم. از اونجا که Stream Id از نوع Guid هست پس همون Identity بهتر هست.


بنابه نیاز جدولامو (http://uupload.ir/files/k75_snapshot12.jpg)یکم تغییر دادم :

145690

در اموزشهایی که واسه ساخت جدول از نوع FileStream یا FileTable داده شده آی دی جدول از نوع Uniqueidentifier بوده (مانند کد زیر :)



CREATE TABLE [tblFiles]
(
FileId UNIQUEIDENTIFIER NOT NULL ROWGUIDCOL UNIQUE DEFAULT(NEWID()),
ReferralId int NOT NULL,
SheetId int NOT NULL,
SystemFile VARBINARY(MAX) FILESTREAM NULL
)
ON [PRIMARY] FILESTREAM_ON [fg1]

با توجه به جداولم بنظرتون بازم نیازه از آی دی int استفاده کنم ؟ (اگه اره مزایاشو میفرمایین ؟)
و اینکه جستجو بر حسب ReferralId + SheetId صورت میگیره که فکر کنم این دوتاباهم ایندکس بگیرم بهتر باشه ؟ (که referralID خودش با آی دی دانشجو و تاریخ ها سرچ میشه)

ممنون میشم دوستان نظر بدن