ورود

View Full Version : نحوه ایجاد رابطه میان FileTable ها و جداول بانک اطلاعاتی



csharpcollegian
سه شنبه 24 اسفند 1395, 19:15 عصر
سلام دوستان وقتتون به خیر
سال نو رو پیشاپیش به همه عزیزان تبریک میگم
دوستان من برای پروژه ی جدیدم تصمیم گرفتم از FileTable ها برای ذخیره ی عکس هام استفاده کنم. جستجوی زیادی توو نت کردم و با نحوه ی ایجاد و همچنین ثبت اطلاعات در FileTable ها آشنا شدم.
فقط یک سوال برام باقی مونده و اونم نحوه ارتباط میان یک FileTable و جداول بانک اطلاعاتی هستش !؟
چیزی که من فهمیدم اینه که باید عکسم رو در FileTable مربوطه ذخیره کنم و سپس از ستون stream_id در جدولی که عکس مربوط به اون هست استفاده کنم. خب پس باید در جدول مربوطه یک ستون ImageID ایجاد کنم و اون رو به عنوان کلید خارجی FileTable در نظر بگیرم و مقدار stream_id رو داخلش قرار بدم. اما خب مشکل اینجاست که توو مطالبی که من در رابطه با FileTable ها خوندم، نوشته که نباید هیچ تغییری در اونها ایجاد کرد و زمانی هم که سعی می کنم بین جدول اصلی و FileTable رابطه ایجاد کنم، SQL Server یه هشدار میده و سپس رابطه رو ایجاد می کنه !
میخواستم بدونم آیا این هشدار بعدا مساله ساز نمیشه ؟ اصلا راه اصولی استفاده از FileTable ها همینطوره ؟
ببخشید که سوالم خیلی طولانی شد
خیلی ممنونم

alireza_s_84
سه شنبه 24 اسفند 1395, 19:28 عصر
سلام دوستان وقتتون به خیر
سال نو رو پیشاپیش به همه عزیزان تبریک میگم
دوستان من برای پروژه ی جدیدم تصمیم گرفتم از FileTable ها برای ذخیره ی عکس هام استفاده کنم. جستجوی زیادی توو نت کردم و با نحوه ی ایجاد و همچنین ثبت اطلاعات در FileTable ها آشنا شدم.
فقط یک سوال برام باقی مونده و اونم نحوه ارتباط میان یک FileTable و جداول بانک اطلاعاتی هستش !؟
چیزی که من فهمیدم اینه که باید عکسم رو در FileTable مربوطه ذخیره کنم و سپس از ستون stream_id در جدولی که عکس مربوط به اون هست استفاده کنم. خب پس باید در جدول مربوطه یک ستون ImageID ایجاد کنم و اون رو به عنوان کلید خارجی FileTable در نظر بگیرم و مقدار stream_id رو داخلش قرار بدم. اما خب مشکل اینجاست که توو مطالبی که من در رابطه با FileTable ها خوندم، نوشته که نباید هیچ تغییری در اونها ایجاد کرد و زمانی هم که سعی می کنم بین جدول اصلی و FileTable رابطه ایجاد کنم، SQL Server یه هشدار میده و سپس رابطه رو ایجاد می کنه !
میخواستم بدونم آیا این هشدار بعدا مساله ساز نمیشه ؟ اصلا راه اصولی استفاده از FileTable ها همینطوره ؟
ببخشید که سوالم خیلی طولانی شد
خیلی ممنونم
امکان قرار دادن رابطه روی FileTable نیست. به جای FileTable از جداول معمولی که FileStream فعال شده استفاده کنید که همون کار رو انجام میدن.
ابتدا فایل استریم رو در سطح پایگاه داده فعال کنید. (که چون FileTable ساختین الزاما فعال شده)
ابتدا دستورات زیر رو اجرا کنید که تابعی برای تشخیص نوع فایل به پایگاه داده اضافه بشه:
CREATE FUNCTION [dbo].[GetFileType](@fileName nvarchar(Max)) RETURNS nvarchar(300)
AS
BEGIN DECLARE @Index int;
SET @Index = CHARINDEX('.', REVERSE(@fileName)) - 1;
IF(@Index < 1)
RETURN N'Unknown';
RETURN RIGHT(@fileName, @Index)
END
سپس یک جدول بسازید:
CREATE TABLE [dbo].[tbl_FileStores]( [FileStoreId] [uniqueidentifier] ROWGUIDCOL NOT NULL DEFAULT (newsequentialid()),
[FileData] [varbinary](max) FILESTREAM NULL,
[FileName] [nvarchar](255) NOT NULL,
[MimeType] [nvarchar](300) NOT NULL,
[FileType] AS ([dbo].[GetFileType]([FileName])),
[FileSize] AS (datalength([FileData])),
[CreationTime] [datetime] NOT NULL DEFAULT (getdate()),
CONSTRAINT [PK_dbo.tbl_FileStores] PRIMARY KEY CLUSTERED
(
[FileStoreId] ASC
) ON [PRIMARY] FILESTREAM_ON [db_Sajaa_DataFileGroup]
) ON [PRIMARY] FILESTREAM_ON [db_Sajaa_DataFileGroup]

حالا میتونید رابطه ایجاد کنید. در واقع این جدول با جدول FileTable تفاوتی نداره و هردو از یک ساختار استفاده میکنن. منتها اینجا من ساختار دایرکتوری رو حذف کردم چون به اون نیازی نداشتم. در صورتیکه شما نیاز داشته باشی میتونی ستون مربوطه رو اضافه کنی.
فقط به جای db_Sajaa_DataFileGroup شما باید اسم FileGroup که ساختی رو قرار بدی.

csharpcollegian
پنج شنبه 26 اسفند 1395, 18:01 عصر
امکان قرار دادن رابطه روی FileTable نیست. به جای FileTable از جداول معمولی که FileStream فعال شده استفاده کنید که همون کار رو انجام میدن.
ابتدا فایل استریم رو در سطح پایگاه داده فعال کنید. (که چون FileTable ساختین الزاما فعال شده)
ابتدا دستورات زیر رو اجرا کنید که تابعی برای تشخیص نوع فایل به پایگاه داده اضافه بشه:
CREATE FUNCTION [dbo].[GetFileType](@fileName nvarchar(Max)) RETURNS nvarchar(300)
AS
BEGIN DECLARE @Index int;
SET @Index = CHARINDEX('.', REVERSE(@fileName)) - 1;
IF(@Index < 1)
RETURN N'Unknown';
RETURN RIGHT(@fileName, @Index)
END
سپس یک جدول بسازید:
CREATE TABLE [dbo].[tbl_FileStores]( [FileStoreId] [uniqueidentifier] ROWGUIDCOL NOT NULL DEFAULT (newsequentialid()),
[FileData] [varbinary](max) FILESTREAM NULL,
[FileName] [nvarchar](255) NOT NULL,
[MimeType] [nvarchar](300) NOT NULL,
[FileType] AS ([dbo].[GetFileType]([FileName])),
[FileSize] AS (datalength([FileData])),
[CreationTime] [datetime] NOT NULL DEFAULT (getdate()),
CONSTRAINT [PK_dbo.tbl_FileStores] PRIMARY KEY CLUSTERED
(
[FileStoreId] ASC
) ON [PRIMARY] FILESTREAM_ON [db_Sajaa_DataFileGroup]
) ON [PRIMARY] FILESTREAM_ON [db_Sajaa_DataFileGroup]

حالا میتونید رابطه ایجاد کنید. در واقع این جدول با جدول FileTable تفاوتی نداره و هردو از یک ساختار استفاده میکنن. منتها اینجا من ساختار دایرکتوری رو حذف کردم چون به اون نیازی نداشتم. در صورتیکه شما نیاز داشته باشی میتونی ستون مربوطه رو اضافه کنی.
فقط به جای db_Sajaa_DataFileGroup شما باید اسم FileGroup که ساختی رو قرار بدی.

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

csharpcollegian
شنبه 28 اسفند 1395, 14:48 عصر
عزیزان کسی نحوه استفاده از FileTable ها رو بلد نیست ؟
ممنون میشم راهنماییم کنید

حمیدرضاصادقیان
یک شنبه 29 اسفند 1395, 06:06 صبح
سلام
بله برای برقراری ارتباط باید از نوع Stream_ID استفاده کنید.
چون روی این فیلد یک Unique index تشکیل شده که در واقع برای هر فایل یک ID جداگانه ای اختصاص میده و نیازی نیست برید از FileStream استفاده کنید.
مشکلی هم برای شما ایجاد نمیکنه.

csharpcollegian
پنج شنبه 03 فروردین 1396, 19:23 عصر
سلام
بله برای برقراری ارتباط باید از نوع Stream_ID استفاده کنید.
چون روی این فیلد یک Unique index تشکیل شده که در واقع برای هر فایل یک ID جداگانه ای اختصاص میده و نیازی نیست برید از FileStream استفاده کنید.
مشکلی هم برای شما ایجاد نمیکنه.
سلام جناب صادقیان عزیز با تشکر از پاسختون یک سوال کوچیک دیگه هم دارم که ممنونتون میشم راهنماییم کنید.
فرض کنیم عکس زیر جدول Product هستش و ستون ImageID هم کلید خارجی FileTable حاوی عکس هاست.

144742


با فرض اینکه نام FileTable مورد نظر ProductImages باشه، برای ثبت یک رکورد من در ابتدا فایل عکس رو در جدول ProductsImages ثبت می کنم و بعد به کمک کد زیر شناسه عکس ثبت شده رو برای ثبت در ستون ImageID از جدول Product استخراج می کنم :

144743

سوال اولم اینه که آیا اصلا سناریوی بالا اصولی هستش ؟ یا راه استاندارد دیگه ای وجود داره ؟
و سوال دوم اینکه اگر اصولی هست، در کد بالا باید جدول رو بر اساس کدوم ستون Sort کنم (علامت سوال در عکس) تا نتیجه درستی بگیرم ؟
ستون stream_id رو امتحان کردم جواب نداد، بر اساس ستون creation_time جواب میده اما خب سیستم خیلی آسیب پذیر میشه و با کوچکترین تغییر در ساعت سیستم، همه چی بهم میریزه !
ببخشید اگر سوالم طولانی شد
خیلی ممنونم