PDA

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



MOJTABAATEFEH
پنج شنبه 26 اسفند 1389, 19:31 عصر
سلام دوستان عزیز من در بانکم جدولی دارم که همراه مابقی فیلدها حدود 7 تصویر هم باید ذخیره شود آیا از لحاظ کارآیی مشکلی نیست که همه فیلدها (تصویر و مابقی) در یک جدول باشند؟

Reza_Yarahmadi
جمعه 27 اسفند 1389, 13:31 عصر
پیشنهاد میشه عکسها رو در جدول مجزایی ذخیره کنید و id تصویر رو در جدول اصلی بذارید (مخصوصا در صورتی که فیلد عکس از نوع (varbinary(max نباشد و بصورت فرضا (varbinary(2000 باشد) این کار باعث افزایش سرعت جستجوها میشه.

MOJTABAATEFEH
جمعه 27 اسفند 1389, 21:07 عصر
دوست عزیز منظورتون از ID فیلد مشترک هست؟
یعنی مثلا کد ملی رو مشترک بزارم یا منظورتون چیز دیگه ایست؟

با تشکر

Reza_Yarahmadi
جمعه 27 اسفند 1389, 23:03 عصر
دوست عزیز منظورتون از ID فیلد مشترک هست؟
یعنی مثلا کد ملی رو مشترک بزارم یا منظورتون چیز دیگه ایست؟
من عرض کردم Id تصویر ، وقتی تصاویر رو توی جدول مجزایی ذخیره میکنید باید رابطه ای با جدول اصلی به وجود بیارید(باید معلوم باشه هر تصویر مربوط به چه رکوردی از جدول اصلی است) برای این موضوع معمولا فیلدی با نام ID به جدول تصاویر اضافه میکنند که Identity آن true است و رابطه مذکور رو بر اساس اون درست میکنند.(رابطه برعکس چیزی که شما مد نظرتونه ، یعنی جدول اصلی از ID موجود در جدول تصاویر استفاده میکنه نه اینکه جدول تصاویر بخواد از کدملی استفاده کنه)

MOJTABAATEFEH
شنبه 28 اسفند 1389, 09:49 صبح
من عرض کردم Id تصویر ، وقتی تصاویر رو توی جدول مجزایی ذخیره میکنید باید رابطه ای با جدول اصلی به وجود بیارید(باید معلوم باشه هر تصویر مربوط به چه رکوردی از جدول اصلی است) برای این موضوع معمولا فیلدی با نام ID به جدول تصاویر اضافه میکنند که Identity آن true است و رابطه مذکور رو بر اساس اون درست میکنند.(رابطه برعکس چیزی که شما مد نظرتونه ، یعنی جدول اصلی از ID موجود در جدول تصاویر استفاده میکنه نه اینکه جدول تصاویر بخواد از کدملی استفاده کنه)
دوست عزیز ممنون بابت پاسخ و وقتی که میزارید من تابحال با اینگونه موارد برخورد نکردم ولی مگه فیلدهای Indentity اتوماتیک شماره گذاری نمیشوند و با حذف یک رکورد مثلا با شماره ID عدد 12 فیلدی که شماره ID آن عدد 13 بوده از این پس میشه 12
لطفا راجع به این قضیه اگر امکانش هست یک مثال بنویسید

با تشکر

SReza1
شنبه 28 اسفند 1389, 10:51 صبح
من اگه جاي شما باشم تصاوير رو توي بانك ذخيره نميكنم. بيرون از data base مي‌گذاشتم.
جناب صادقيان به نظر من بهتره يك topic براي اين قسمت به صورت ويژه بگذاريد تا بچه‌ها نظرات خودشون رو بدهند.

MOJTABAATEFEH
شنبه 28 اسفند 1389, 11:16 صبح
دوست عزیز اگر منظورتون ذخیره کردن آدرس عکس هست این هم مشکلات خودش رو داره حتما باید یک راه خوب و بهینه داشته باشه

موفق باشید

Reza_Yarahmadi
شنبه 28 اسفند 1389, 11:39 صبح
با یک مثال ساده توضیح میدم.
فرض کنید میخواید توی جدولتون نام ، نام خانوادگی و 2 تصویر رو ذخیره کنید. برای این منظور 2 جدول بصورت زیر طراحی کنید
جدول اصلی فرضا با نام Users :

Name Nvarchar(100)
Family Nvarchar(250)
PicId_1 Int
PicId_2 Int

و جدول تصاویر با نام Pics
ID Int (Is Identity)
Pic varbinary(6000) (در این مثال عکسهای کمتر از 6 کیلو بایت قابل ذخیره سازی هستند)

حالا SPیی برای ذخیره بصورت زیر تهیه کنید.
Create Proc SP_Insert
@Name nvarchar(100),
@Family nvarchar(250),
@Pic1 varbinary(6000) = null,
@Pic2 varbinary(6000) = null
AS
Declare @PicId_1 int, @PicId_2 int

IF(ISNULL(@Pic1, '') <> '')
Begin
Insert Into Pics(Pic) Values (@Pic1)
Set @PicId_1 = SCOPE_IDENTITY()
End

IF(ISNULL(@Pic2, '') <> '')
Begin
Insert Into Pics(Pic) Values (@Pic2)
Set @PicId_2 = SCOPE_IDENTITY()
End

Insert Into Users(Name, Family, PicId_1, PicId_2)
Values (@Name, @Family, @PicId_1, @PicId_2)
در توضیح SP هم باید گفت ابتدا تصاویر در جدول تصاویر ذخیره شده و مقدار Id هرکدوم درون متغیرهایی نگهداری و درون جدول اصلی ذخیره میشه.

MOJTABAATEFEH
شنبه 28 اسفند 1389, 11:47 صبح
ممنون دوست عزیز بایت جوابتون ولی همونطور که در پست قبلی گفتم بعد از حذف یک رکورد از جدول ها مشکلی برای مابقی اطلاعات موقع بازیابی پیش نمیاد؟ (چون فیلد Indentity مجدد بروزرسانی میشه و با شماره ای که در جدول دیگر ذخیره شده دارای تناقض میشه درسته؟)

Reza_Yarahmadi
شنبه 28 اسفند 1389, 12:32 عصر
وقتی جدولها جدا میشن باید یک Relation بین جدولها ایجاد کرد. این کار باعث میشه در صورتیکه از تصویر در جدول اصلی استفاده شده باشه (یعنی Id یک تصویر در یکی از فیلدهای PicId_1 یا PicId_2 استفاده شده باشه) نشه تصویر رو حذف کرد و مجبور باشید ابتدا در جدول اصلی رکوردهای استفاده کننده رو حذف کنید سپس تصویر رو حذف کنید.
در صورتی هم که تصویر جایی استفاده نشده که مشکلی نیست و حذف میشه.
حالا اگه این Id ها ترتیب نداشته باشند اهمیتی نداره چون به هر حال مسلما هر PicId در جدول اصلی به یک تصویر درست از جدول تصاویر اشاره خواهد کرد.
به این نکته توجه داشته باشید که شما ابتدا تصاویر رو در جدول خودشون ذخیره میکنید سپس اطلاعات در جدول اصلی ذخیره میشه.

MOJTABAATEFEH
شنبه 28 اسفند 1389, 12:53 عصر
دوست عزیز ممنون تا حدوددی متوجه شدم امتحان میکنم آیا راهی هم برای یافتن شماره IDهایی که از بین IDها حذف میشن هست که الکی شماره IDبالا نره و از شماره های حذف شده ی قبلی استفاده کرد؟

با تشکر

Reza_Yarahmadi
شنبه 28 اسفند 1389, 13:18 عصر
آیا راهی هم برای یافتن شماره IDهایی که از بین IDها حذف میشن هست که الکی شماره IDبالا نره و از شماره های حذف شده ی قبلی استفاده کرد؟
خودتون رو بیخودی درگیر این مسئله نکنید! چه اهمیتی داره چه رکوردهایی حذف شدند؟ اگر Idها بالا بره چه مشکلی به وجود میاد؟ اگر ترتیب مرتبی نداشته باشند چه ضرری میزنه؟ نوع داده Int تا 2,147,483,647 رو پشتیبانی میکنه در صورتی که این مقدار برای شما کم است میتونید از Bigint استفاده کنید که تا 9,223,372,036,854,775,807 رو پشتیبانی میکنه.
ولی در کل راه حلهایی هم برای سوال شما وجود داره ، مثلا اینکه این فیلد رو Identity نذارید و مقدارش رو خودتون هندل کنید که این مستلزم کدنویسی بیشتر و دقت زیاد در تغییر Id در صورت حذف یک رکورد. ویا اینکه تغییری در طراحی ندید و در محدوده های زمانی معین Idها دوباره سازی کنید ولی باید تمام PicIdها هم دوباره سازی وبا Id جدید خودشون تنظیم بشن.
اگر به راه حلها توجه کنید میبینید که به دردسر کار نمی ارزه که خودتون رو درگیر این قضیه کنید!!:چشمک:

MOJTABAATEFEH
چهارشنبه 03 فروردین 1390, 11:11 صبح
وقتی جدولها جدا میشن باید یک Relation بین جدولها ایجاد کرد. این کار باعث میشه در صورتیکه از تصویر در جدول اصلی استفاده شده باشه (یعنی Id یک تصویر در یکی از فیلدهای PicId_1 یا PicId_2 استفاده شده باشه) نشه تصویر رو حذف کرد و مجبور باشید ابتدا در جدول اصلی رکوردهای استفاده کننده رو حذف کنید سپس تصویر رو حذف کنید.
در صورتی هم که تصویر جایی استفاده نشده که مشکلی نیست و حذف میشه.
حالا اگه این Id ها ترتیب نداشته باشند اهمیتی نداره چون به هر حال مسلما هر PicId در جدول اصلی به یک تصویر درست از جدول تصاویر اشاره خواهد کرد.
به این نکته توجه داشته باشید که شما ابتدا تصاویر رو در جدول خودشون ذخیره میکنید سپس اطلاعات در جدول اصلی ذخیره میشه.

دوست عزیز اگر بخواهیم مابقی اطلاعات رو بدون تصویر ذخیره کنیم یعنی عملا رکوردی در جدول تصاویر نخواهیم داشت و به طبع ID جدید این مشکل رو چطور میشه حل کرد؟

با تشکر

Mahbod Rad
چهارشنبه 03 فروردین 1390, 19:52 عصر
سلام Mojtaba سوالاتت یک کمی عچیبه.
من راه حل دخیره تصویر درجدول را نمی پسندم اما برای منظور شما جدول شما باید دوتا قیلد داشته باشد. یکی ID و دیگری قیلد تصویر
جدول مثلاً اشخاص شما هم باید علاوه برتمام فیلدها باید یک فیلدی برای ارتباط با این جدول تصویر داشته باشد که در آن شماره آی دی تصویر را ذخیره میکنید
اگر برای فردی تصویر ندارید پس عددی هم در فیلد ارتباطی ذخیره نخواهید کرد