آشنایی با FileTable در SQL Server 2012 بخش 1
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: سه دقیقه

پیش از آشنایی با FileTable نیاز است که پیشینه‌ای از شیوه‌های ذخیره‌سازی فایل و یا بهتر بگویم BLOB در SQL Server را داشته باشیم. نخستین شیوه‌ى نگه‌داری فایل استفاده از Image است که در SQL Server 2000 کاربرد داشت و هم‌اکنون استفاده از آن به دلیل کاهش بسیار کارآیی منسوخ‌شده است. به دلایل مشکلات بسیار فراوان Image هم‌زمان بسیاری از طراحان پایگاه داده‌ها، جهت کاهش حجم جدول‌ها و پیروی آن حجم پایگاه داده‌ها، فایل را در سیستم‌فایل نگه‌داری می‌کردند و تنها مسیر آن را در فیلدی از نوع کاراکتری در پایگاه‌داده‌ها ذخیره می‌کردند. این روش هرچند از حجم پایگاه داده‌ها می‌کاست ولی به دلیل عدم دخالت SQL Server در مدیریت فایل‌ها مشکلات دیگری را به وجود آورد.
از SQL Server 2005 نوع داده‌ى varbinary(max) معرفی شد که برخی از چالش‌های به‌کاربری Image را کاست و درباره‌ى بسیاری از موارد مانند ذخیره‌ى عکس پرسنلی هنوز هم کاربرد دارد؛ ولی توجه داشته باشید که استفاده از این فیلد فقط برای فایل‌های کم‌تر از 256 کیلوبایت سفارش شده است و برای بالاتر از آن، کارآیی کاهش فراوانی خواهد یافت.
در  SQL Server 2008 نوع داده‌ى جدیدی به نام FileStream به وجود آمد به این شکل که یک FileGroup از نوع  Data FileStream به پایگاه‌داده افزوده می‌شود و در واقع با یک پوشه در سیستم فایل در پیوند است. از این پس هنگام ساخت یک جدول به جای استفاده از نوع داده‌ى varbinary از نوع FileStream استفاده می‌کنیم با مد نظر داشتن این نکته که حتماً باید یک فیلد از نوع Uniqueidentifier هم در آن جدول تعریف شده باشد. شیوه‌ى کار نیز به این صورت خواهد بود که خود رکورد در جدول ذخیره می‌شود و فقط محتوای فایل در آن مسیری از NTFS ذخیره می‌شود. برخلاف روش درج مسیر فایل در جدول که پس از حذف رکورد، فایل هم‌چنان در سیستم فایل می‌ماند؛ این بار با حذف رکورد فایل مربوطه نیز حذف خواهد شد. افزون بر این مدیریت پشتیبانی از فایل‌ها نیز برعهده‌ى پایگاه داده‌ها خواهد بود. اندازه‌ى فایل‌ها در FileStream محدودیت‌های پیشین را نخواهد داشت و شما به اندازه‌ى حجم درایو هارددیسک می‌توانید فایل در آن ذخیره کنید. نکته‌ى دیگر درباره‌ى فایل‌های با حجم سنگین که می‌توانید Stream مربوط به یک فایل را به صورت بخش‌بخش در سمت مشتری بارگذاری کنید و به او نشان دهید. در FileStream امنیت و تراکنش فایل‌ها برعهده‌ى SQL Server است و از این دیدگاه بسیار ساده‌تر و کارآتر از FileSystem است. (برای آشنایی بیشتر با FileStream، این نوشتار از مهندس وحید نصیری را مطالعه کنید.)
گونه‌ى FileTable از ویژگی‌های نوین SQL Server 2012 است که تکمیل‌کننده‌ى FileStream است. FileTable آمیزشی از FileStream با hierarchyid و سیستم فایل ویندوز برای ارائه‌ى توانایی‌های نوین مدیریت BLOB در  SQL Server است. FileTable همان‌گونه که از دو واژه‌ى تشکیل‌دهنده‌اش پیداست؛ هم‌زمان یک جدول و یک سیستم فایل معمولی است.
FileTable به هر روی یک جدول از پایگاه‌داده‌های SQL Server است با یک تفاوت که ساختار آن از پیش تعریف‌شده است. ستون‌های FileTable و نوع داده‌ى آن از پیش توسط SQL Server  مشخص شده است. ستون‌های تشکیل‌دهنده‌ى FileTable دربرگیرنده‌ى جدول زیر است:

هر ردیف از FileTable نماینده‌ى یک فایل یا پوشه در File System است. ستون path_locator که از نوع hierarchyid است نشان‌دهنده‌ى مسیر یک فایل یا پوشه است. hierarchyid که از SQL Server 2008 معرفی شده است؛ بهترین نوع داده برای نگه‌داری ارتباط ساختار سلسله‌مراتبی مانند چارت سازمانی، درخت تجهیزات یک کارخانه و یا در همین نمونه درخت فایل‌ها و پوشه‌ها است. پس می‌توانیم از همه‌ى امکانات hierarchyid در FileTable نیز برخوردار شویم. این‌که این فایل به ترتیب در چه پوشه‌هایی قرار گرفته است یا این‌که این پوشه شامل چه فایل‌ها یا پوشه‌هایی خواهد بود. این‌که پوشه‌های هم‌فرزند پوشه‌ى جاری کدام است و یا یا توابع مربوط به جابه‌جایی فایل‌ها و پوشه‌ها.

دنباله دارد...

  • #
    ‫۱۱ سال و ۵ ماه قبل، سه‌شنبه ۱۷ اردیبهشت ۱۳۹۲، ساعت ۲۰:۵۶
    با سلام و خسته نباشید
    مطلب خیلی خوبی بود فقط اگر امکان دارد در یک بخش درباری hierarchyid نیز کامل به همراه مثال توضیح دهید
    با تشکر
    • #
      ‫۱۱ سال و ۵ ماه قبل، سه‌شنبه ۱۷ اردیبهشت ۱۳۹۲، ساعت ۲۱:۵۷
      درود بر شما
      پیشنهاد خوبی است. پیش از این نوشتاری در این باره نوشته بودم (هرچند منتشر نکرده ام.) ولی با یادداشت شما به این اندیشه افتادم که مروری بر این بحث در SQL Server 2012 داشته باشم و با ویرایشی نوین، در این تارنما منتشر کنم.
  • #
    ‫۱۱ سال و ۵ ماه قبل، چهارشنبه ۱۸ اردیبهشت ۱۳۹۲، ساعت ۰۰:۰۱
    با سلام و تشکر از این مطلب خوب.
    آیا نوع فیلدها قابل تغییر است؟
    برای مثال در فیلد Name چون varchar است نمیتوان نام فارسی برای فایل ثبت کرد، آیا امکان تغییر آن به Nvarchar هست؟
    ممنون از شما.
    • #
      ‫۱۱ سال و ۵ ماه قبل، چهارشنبه ۱۸ اردیبهشت ۱۳۹۲، ساعت ۰۳:۲۸

      در اصل nvarchar هست که به نظر در جدول فوق باید اصلاح بشه.

      • #
        ‫۱۱ سال و ۵ ماه قبل، چهارشنبه ۱۸ اردیبهشت ۱۳۹۲، ساعت ۱۱:۲۳
        بله. اشتباه از من بود. این فیلدها غیرقابل تغییر هستند ولی هیچ مشکلی هم با زبان پارسی ندارند.
  • #
    ‫۱۰ سال و ۱۰ ماه قبل، پنجشنبه ۱۴ آذر ۱۳۹۲، ساعت ۲۳:۴۹
    سلام. ممنون از مطلب مفیدتون. فقط یک مشکلی هست و اون عدم پشتیبانی توسط Linq2Sql هست. فکر کنم فقط با DataSet مشکلی نداشته باشه و اون هم بخاطر این هست که نوع hierarchyid به نوع nvachar(867) تبدیل میکنه.
    لطفا اگه برای این مشکل راه حلی هست بنویسید که دوستان هنگام استفاده به مشکل برنخورند
    • #
      ‫۱۰ سال و ۱۰ ماه قبل، جمعه ۱۵ آذر ۱۳۹۲، ساعت ۰۰:۰۱
      Linq2Sql که خیلی وقت هست با EF جایگزین شده. EF هم از نوع‌های خاص دیتابیس‌ها عموما پشتیبانی نمی‌کنه. بحث EF هم نیست. اکثر ORMهای موجود همینطور هستند.
      • #
        ‫۱۰ سال و ۱۰ ماه قبل، جمعه ۱۵ آذر ۱۳۹۲، ساعت ۰۲:۳۸
        یعنی فقط باید از DataSet استفاده کرد !؟
        • #
          ‫۱۰ سال و ۱۰ ماه قبل، جمعه ۱۵ آذر ۱۳۹۲، ساعت ۰۴:۳۱
          ADO.NET می‌تونه خروجی از نوع DataSet هم بده؛ ولی اسمش DataSet نیست. تمام ORMها هم برفراز ADO.NET کار می‌کنند. بنابراین اگر تصور کنیم که ابدا نمی‌شود با این‌ها کار کرد، خیر. اینطور نیست. شما با ORMها هم می‌تونی مستقیما SQL بنویسی ef-code-first-13 تا به قابلیت‌هایی دسترسی پیدا کنی که در ORM پیش بینی نشده.
      • #
        ‫۹ سال و ۳ ماه قبل، چهارشنبه ۳ تیر ۱۳۹۴، ساعت ۱۴:۳۸
        استفاده از FileTable در EF
        http://www.eidias.com/blog/2013/12/4/using-sql-filetable-in-entity-framework 
        • #
          ‫۹ سال و ۳ ماه قبل، چهارشنبه ۳ تیر ۱۳۹۴، ساعت ۱۴:۵۶
          SP نوشته. بله. میشه مستقیما SQL بنویسی منتها این اسمش کار با ORM نیست.
  • #
    ‫۱۰ سال و ۹ ماه قبل، یکشنبه ۱۵ دی ۱۳۹۲، ساعت ۰۳:۲۱
    سلام
    چطور امنیت فایل‌ها رو برقرار کنیم ؟ منظورم اینه که کسی نتونه اونا رو پاک یا مشاهده و یا اضافه کنه ، مگه اینکه ما بهش اجازه بدیم 
    راهی برای این کار هست ؟
    • #
      ‫۱۰ سال و ۹ ماه قبل، یکشنبه ۱۵ دی ۱۳۹۲، ساعت ۰۴:۱۵
      مگه کاربران شما مستقیما با فایل سرور کار می‌کنند؟ روال عادی آن کار از طریق یک برنامه مثلا وب هست. امنیت رو در اونجا پیاده سازی کنید.
      • #
        ‫۱۰ سال و ۹ ماه قبل، یکشنبه ۲۲ دی ۱۳۹۲، ساعت ۱۴:۴۱
        من دارم از اپلیکیشن استفاده میکنم . از داخل برنامه درست هست ، یعنی همونی که شما میگی . ولی اگه کسی از بیرون برنامه بخواد این کارو کنه چی ؟
        مستقیم بره تو پوشه و فایل‌ها رو تغییر بده . من میخوام بدونم sql میتونه جلوی این کارو هم بگیره ؟ 
        • #
          ‫۱۰ سال و ۹ ماه قبل، یکشنبه ۲۲ دی ۱۳۹۲، ساعت ۱۵:۴۲

          - به چه نحوی از SQL Server استفاده می‌کنید؟ آیا سرور و برنامه دسکتاپ شما روی یک کامپیوتر هستند؟ برای اینکار بهتر است از SQL CE یا SQLite استفاده کنید؛ یا حتی LocalDB. هدف از SQL Server نصب آن روی یک سرور و خدمات دهی به چندین و چند کامپیوتر تحت شبکه است. برای استفاده روی یک کامپیوتر یعنی کسب و کار کوچک و عملا نیازی به SQL Server 2012 ندارد اینکار. زندگی مصرف کننده را سخت نکنید. نصب و نگهداری یک سرور کار هر شخصی نیست و برای سازمان‌ها طراحی شده و نه مصارف کوچک تک کاربره دسکتاپ.

          - با این توضیح اگر کسی به سرور شما دسترسی دارد، آیا نمی‌تواند مثلا اگر فایل‌ها در دیتابیس ذخیره می‌شدند، اون‌ها رو دستی با یک کوئری حذف کند؟ امنیت کار با سرور این‌جا است که مطرح می‌شود و همچنین اطمینان به ادمین‌ها.

          - در مورد امنیت file table مراجعه کنید به مستندات مایکروسافت. مثلا: FileTables are secured by SQL Server security only