PDA

View Full Version : مشکلات شبکه : طراحی و ارتباط جداول ، قفلهای رکوردست ها و ...



vbstar
چهارشنبه 01 بهمن 1382, 10:59 صبح
سلام خدمت تمام برنامه نویس های عزیز :

برای طراحی برنامه های دیتابیس تحت شبکه باید اصولی را از ابتداء مد نظر قرار دهیم ، حال چند سوال یا تکنیک در طراحی این برنامه ها حائز اهمیت می باشد که من قصد دارم با همکاری دوستان برنامه نویس به توضیح این نکات ریز و درشت بپردازیم :

اولاً : باید اعلام کنم دیتابیسی که ما مد نظر داریم SQL Server 2000‌ می باشد.

سوالات عبارتند از :
1- جداول در برنامه چگونه باید طراحی شوند.
2- از چه فیلدهای باید در جداول بعنوان کلید اصلی و رابط استفاده کرد.
3- برای جلوگیری از تداخل عملیاتی ، که کاربرها بر روی یک جدول مشترک انجام میدهند ، مانند تداخل در هنگام ذخیره ، ویرایش اطلاعات در یک زمان بر روی یک رکورد.
4- انتخاب نوع قفلهای رکوردست : هنگام ذخیره رکورد ، ویرایش رکورد و آپ دیت رکورد.
5- توپولوژی شبکه.
6- و هر موردی که می تواند برای برنامه مشکل ساز باشد.

VBstar

vbstar
پنج شنبه 02 بهمن 1382, 22:57 عصر
برنامه نویسان شبکه :

فکر می کنم خیلی از دوستان در برنامه نویسی تحت شبکه تجربیاتی بدست آورده اند که این تجربیات بسیار گرانقدر و ارزشمند هستند چه خوب است این تجربیات را با هم درمیان بگذاریم.

با تشکر از همه دوستان برنامه نویس / VBstar

vbstar
شنبه 04 بهمن 1382, 20:35 عصر
ظاهراً دوستان علاقه ای به این موضوع ندارند :

به هرحال من مشکلاتم رو تا اندازه ای تونستم امروز که 4/11/82 هستش تو دانشگاه حل کنم ، ولی اگر کسی مشکلی داشت بنویسه اینجا اگر بتونم کمکش می کنم چون نمی خوام بقیه مثل من و دوستم فرشاد زیاد زجر بکشن که درست میشه یا نه.

VBstar

الهام تفریشی
شنبه 04 بهمن 1382, 23:25 عصر
راستش من خیلی اشکال دارم
و خیلی هم دنبالش گشتم ولی تاحالا به جواب نرسیدم
اگه لطف کنین بگین که ممنون میشم
این مسئله خیلی مهم هست و نباید سر سری هم گرفته شود
من توقع داشتم دوستان پیش کسوت اینجا خیلی مطالب قابل ارائه داشته باشن

vbstar
یک شنبه 05 بهمن 1382, 00:44 صبح
خانم تفریشی عزیز :

خوشحال هستم از اینکه یک نفر هم که شده به این موضوع توجه کرده ، لطفاً مشکل خود را بیان کنید تا ببینم چیه ؟
امیدوارم که بتونم کمکتون کنم.
به امید حق.

VBstar

الهام تفریشی
یک شنبه 05 بهمن 1382, 07:31 صبح
راستش دوست عزیز
من به طور کلی از پایه در مورد این مسئله مشکل دارم
اگه میشه لطف کنین و از ابتدا توضیحی دهید
پیشاپیش از لطف شما ممنون هستم

jannati
یک شنبه 05 بهمن 1382, 07:49 صبح
به نظر من اون دوسه مورد اول مثلا طراحی جداول و یا رابطشون و یا تعیین کلیدها نیاز به یک مهندسی نرم‌افزار دارد تا با رعایت جوانب بهینه ترین جداول طراحی شوند و ربطی به تحت شبکه بودن یا singelبودن برنامه نداره.من با SQL Server2000کارکردم.البته نه خیلی حرفه‌ای.ولی تا این حد بگم که Adminestartorشبکه باید برای شما یک فضا روی سرور تعریف کنه.بعد شما از اون فضا برای ساختن پایگاه اطلاعاتیتون استفاده میکنید.درهمان sql server2000.فقط باید در برنامه نام سرور رامتغییر بگیرید تا وقتی سرور برنامه عوض شد مشکلی پیش نیاد.جداولتون را هم همانجا میسازید.......
امیدوارم تا حدی کمک کرده باشم.اگه دوستان سوالی داشته باشند تا جایی که بتونم در خدمت هستم. :wink:

الهام تفریشی
یک شنبه 05 بهمن 1382, 08:07 صبح
جنتی جان
ممنون از لطفت
ولی دوست عزیز ایناشو که میدونیم
اگه میشه سوال هایی که VBstar مطرح کرد رو توضیح بدی ممنون میشم

A.Noor
یک شنبه 05 بهمن 1382, 12:54 عصر
با سلام
عمده مشکل اینجاست که دو یا چند کاربر یک رکورد خاص را ویرایش کنند .
یک راه اینه که :
وقتی کاربری یک رکورد را خواست ویرایش کنه کلید آن رکورد را در جدولی دیگر ثبت کنیم و وقتی ویرایشش تمام شد آنرا حذف کنیم . در اینصورت هر کاربر دیگری خواست رکوردی را ویرایش کنه اول بررسی میشه که آیا چنین رکوردی در حال ویرایش هست یا نه ؟

شاید بقیه راه بهتری سراغ داشته باشند.

vbstar
چهارشنبه 08 بهمن 1382, 14:30 عصر
نور بالا عزیز :

شما برای اینکه تداخل مابین کاربرها را برروی یک رکورد کنترل کنید راه سادهتر اینه که شما وقتی یک کاربر بر روی یک رکورد در حال ویرایش هستش هیچ مشکلی ندارید ولی وقتی می خواهند تغییرات را ذخیره کنند برای کاربری دومی یه پیغام خطا نمایش داده میشود .
پس می تونیم این خطا را با On Error Goto Err بررسی کنیم و درصورت بروز عملیات کاربر را تا پایان عملیات کاربر 1 نگه داریم و بعد از آن عملیات ذخبره را انجام دهیم.

البته اگر شما از قفل .LockType = adLockOptimistic استفاده کرده باشید

VBstar

A.Noor
پنج شنبه 09 بهمن 1382, 12:16 عصر
ممنونم از پاسختان
اما من با روش Ado در لحظه‌ای که می‌خواهم رکورد را واکشی یا Update کنم با بانک تماس می‌گیرم . در اینصورت در زمانیکه کاربر اول مشغول تغییر اطلاعات یک رکورد خاص باشه و درست در همین لحظه کاربر دوم واکشی را انجام بده و مشغول تغییر اطلاعات بشه در اینصورت کاربر اول و بعد از او کاربر دوم اطلاعات بهنگام شده خودشون را درون آن رکورد می‌ریزند بدون اینکه سیستم پیام خطایی بده چرا که هر کاربر در یک لحظه کوتاه وصل بانک و آن رکورد میشه و تغییرات رو ذخیره میکنه و اتصال او به بانک دوباره قطع میشه .

vbstar
پنج شنبه 09 بهمن 1382, 13:05 عصر
نوربالا عزیز :

وقتی کاربر دوم اطلاعات را واکشی می کند و بعد از کاربر 1 اطلاعات را update می کند یقیناٌ تغییراتی که کاربر اول انجام میدهد بی حاصل است .
چرا ؟
بخاطر اینکه هنوز کاربر اول تغییرات خود را ذخیره نکرده و در همین لحظه کاربر دوم اطلاعات را از جدول واکشی کرده پس اطلاعاتی که کاربر 1 ذخیره می کند بعد از ذخیره در بانک چون اطلاعاتی را که کاربر 2 واکشی کرده و این واکشی مربوط به اطلاعات قبل از update کردن کاربر 1 هستش پس تمامی اطلاعات که کاربر 2 ذخیره می کند در جدول update میشود و تغییرات کاربر 1 عملاٌ در بانک وجود ندارد.
اگر درست من برداشت کرده باشم که همزمان 2 کاربر اطلاعات را باهم از یک جدول واکشی نمایند و بعد پشت سر هم تغییرات را update کنند.

vbstar
پنج شنبه 09 بهمن 1382, 13:10 عصر
نوربالا عزیز :

وقتی کاربر 1 در حال کار کردن بر روی رکورد است باید رکورد قفل شود تا تغییرات کاربر 1 انجام شود و بعد از آن اطلاعات واکشی شده توسط کاربر 2 در فرم رفرش شود و بعد تغییرات خود را ذخیره کند.

مثلاً : اگر کاربر 1 در حال وارد کردن داده حسابداری باشد و کاربر 2 بخواهد بر اساس این داده ها محاسبات حسابداری را انجام دهد به مشکل بر خواهیم خورد.

A.Noor
یک شنبه 12 بهمن 1382, 10:17 صبح
وقتی کاربر 1 در حال کار کردن بر روی رکورد است باید رکورد قفل شود تا تغییرات کاربر 1 انجام شود و بعد از آن اطلاعات واکشی شده توسط کاربر 2 در فرم رفرش شود و بعد تغییرات خود را ذخیره کند.
و این مستلزم آنست که رکوردست ما همچنان باز بماند تا هر کاربر روی هر رکورد که مشغول تغییر دادن شد ، رکورد را قفل نگه دارد تا عمل Update یا انصراف را انجام دهد.
اگر بخواهیم طبق آن روشی که عرض کردم عمل کنیم - که آقای آذیش هم این روش را توصیه می‌کردند - ( یعنی اتصال -> ایجاد رکوردست -> انجام تغییرات -> بستن رکوردست -> قطع اتصال ) قفل کردن رکورد را نمی‌شود انجام داد.
ضمنا یک سوال : رکورد یک جدول اکسس را با چه دستوری قفل می‌کنید ؟

vbstar
دوشنبه 13 بهمن 1382, 00:34 صبح
اگر از ado استفاده میکنی که از قفلهای : readOnly ,Optimistic , Batch Optimistic , Pessimistic شما می توانید استفاده کنید ولی اگر از DAO برای اتصال استفاده می کنید که شما می تونید از منوی Option محیط اکسس این تنظیمات را انجام دهید.
البته به نظر من اینجوری بهتره.

A.Noor
سه شنبه 14 بهمن 1382, 13:28 عصر
اگر از ado استفاده میکنی که از قفلهای : readOnly ,Optimistic , Batch Optimistic , Pessimistic شما می توانید استفاده کنید
منظورتون در هنگام باز کردن رکوردست هست ؟

S.Azish
سه شنبه 14 بهمن 1382, 16:18 عصر
به صورت کلی مشکلات زیادی در طراحی برنامه های که تحت شبکه اجرا میشن هست ولی براساس مطالب و راه حلهای زیر میشه اکثر این مشکلات رو حل کرد:

اول باید مشخص کنید چه اطلاعاتی واقعآ باید در یک زمان فقط توسط یک نفر اصلاح بشن.
تعداد کابرانی که امکان داره در یک زمان با برنامه کار کنند.
نوع دسترسی کاربران.


امکاناتی که ADO در این زمینه داره رو کاملآ فراموش کنید چون عملآ‌ هیچ استفاده ای ندارن مثل نوع Recordset.
همیشه بسته به تعداد کاربرها و حجم اطلاعات نوع دیتابیس صحیح رو انتخاب کنید.
همیشه در طراحی دیتابیس خود جداولی رو در نظر بگیرید که بتونید کاربرها و نوع دسترسی اونا رو مشخص کنید.
همیشه از Connection Pooling در Connection های خود استفاده کنید که باعث میشه در محیطهای که تعداد کابران یک نرم افزار زیاد هست, Connection ها به یک تعداد مشخص باز بشن و برای استفاده های بعدی و یا کاربران جدید از همونها استفاده بشن و Connection جدیدی ایجاد نشه.

اگر اطلاعاتی دارید که همیشه در یک زمان فقط باید توسط یک نفر اصلاح بشه, در جدول خود یک فیلد از نوع TimeStamp تعریف کنید بنابراین زمانی که شما اطلاعات رو میخونید از جدول یک مقدار برای اون فیلد وجود داره. اگر کسی در عین حال که یک کاربر در حال تغییر اطلاعات هست شروع به تغییر همون رکورد بکنه, مسلمآ فیلد TimeStamp مقدارش عوض میشه و قبل از Update کردن اون رکورد شما میتونید مقدار اون فیلد رو با مقداری که در حال حاضر دارید چک کنید و اگر تغییر کرده بود مشخص میشه که اطلاعات توسط شخص دیگری هم اصلاح شده و میتونید یک پیغام خطا نشون بدید.

در طراحی دیتابیس به مبانی قفل کردن دیتابیس یا جدولها فقط فکر نکنید, ببینید آیا واقعآ اونا رو لازم دارید یا نه برای مثال اگر دو نفر در یک زمان با یک جدول کاری انجام بدن آیا مشکلی پیش میاد یا نه. آیا Primary Key رو شما تولید میکنید یا خود جدول و آیا رکوردهای جدید به اطلاعات موجود در جدول بستگی دارن یا نه. تمام این مسائل به طراحی نرم افزار در نهایت برمیگردن و باید به مشکل و طراحی نرم افزار دقت کنید تا فقط به مبانی طراحی دیتابیس.

vbstar
چهارشنبه 15 بهمن 1382, 21:19 عصر
آقای آذیش عزیز :
سلام

اگر لطف کنید و در مورد این فیلد ‏TimeStamp بیشتر توضیح دهید ممنون میشم.
این فیلد در اس کیو ال وجود دارد و یا باید یک همچنین فیلدی در بانک ایجاد کنم و بعد از طریق نرم افزار مقدار آن فیلد را تغییر دهم.

vbstar
پنج شنبه 16 بهمن 1382, 14:51 عصر
سلام آقای آذیش عزیز :

من چک کردم و یک فیلد از نوع TimeStamp تعریف کردم ولی مقدار اون رو از طریق نرم افزار وقتی می خونم چیزی برنمی گردونه که با اون بتونم کاربری را که می خواهد به رکورد دسترسی پیدا کنه کنترل کنم.
لطفاٌ در این زمینه بیشتر توضیح دهید.

با تشکر VBstar

vbstar
شنبه 18 بهمن 1382, 14:13 عصر
آذیش جان ما منتظر توضیح شما در مورد این فیلد هستیم که باید باهاش چکار کنیم.

vbstar
دوشنبه 20 بهمن 1382, 00:38 صبح
آقای آذیش چی شد ، توضیح میدی یا نه
:roll: :roll: :roll: :roll: :roll: :roll: :roll:

S.Azish
سه شنبه 21 بهمن 1382, 02:36 صبح
ببخشید به خاطر جواب دیر

TimeStamp همونطور که میدونید یک عدد واحد هست که با هربار تغییر در رکورد یک مقدار جدید میگیره و نوعی دیتا تایپ در SQL Server هست. در مورد اینکه مقداری در برنامتون نمیگیرید مطمئن نیستم ولی باید چک کنم. لینک زیر هم شاید بتونه کمکتون کنه.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_ta-tz_6fn4.asp


در مورد این مطلب بیشتر براتون توضیح میدم.

vbstar
چهارشنبه 22 بهمن 1382, 10:14 صبح
بابا ای ول آقای آذیش تو که خودت رو با دادن یک آدرس سایت رها کردی .
اگر اطلاعاتی در این مورد داری لطفاٌ بگو تا ما هم رفع مشکل کنیم.
از این آدرس ها ما هم بلدیم ولی التفاتی نمی کنن.
چرا ؟
شما بهتر میدونید حتماٌ اون چیزی که میخواهی رو عمراٌ بتونی توشون پیدا کنی یا میگه پولیه.

بهرحال از اینکه به ما راه رو نشون دادی متشکرم < ولی اگر چیزی در این زمینه باز داری به ما هم بده تا ببنیم چه میشه آخرش.

REZA_KALHOR
یک شنبه 05 فروردین 1386, 08:16 صبح
آقای آذیش شما به عنوان یک برنامه نویس منطقی که همه رو کمک کنید لطفاً ....:افسرده:

alireza1514
یک شنبه 05 فروردین 1386, 09:59 صبح
با سلام خدمت دوستان عزیز ...
من میشه گفت که با بانک اطلاعاتی آشنا هستم ...
من یه مشکلیاا بهتره بگم یه سوال در مغز من داره همین جور وور می خوره من از یه دیتا شیت یا همون دیتا گرید برای نمایش اطلاعات ثبت شده استفاده میکنم ..به فرض مثال زمانی که شما می خواهید یک عملیات جدید را ثبت کنید ابتدا یک لیست باز می شود که یک لیست از عملیات های ثبت شده در گذشته را نشان می دهد حال اگر کاربر1 این لیست را به مدت زیادی باز نگاه دارد و کاربر 2 در حال ثبت عملیات های جدید باشد باالتبع لیستی که برای کاربر یک نمایش داده می شود کامل نیست و حاوی رکوردهای اضافه شده جدید نمی باشد.دوستان شما جهت رفع این مشکل چه راه حلی را پیشنهاد می کنید!!!!

CodeMasterX
دوشنبه 06 فروردین 1386, 02:51 صبح
تاپیک بدی نیست.اما من با اینجور تاپیک ها که همش یه نفر حرف بزنه یا سوال های بسیار ابتدایی مطرح بشه مخالفم.مثل اون آقایی که توی یه تاپیک براش حلقه ها رو توضیح دادم بعدش سوال کرده بود که آموزش مامل برنامه نویسی دیتابیس رو می خوام!!!
چرا برنامه نویس های ما دارن اینجوری میشن ؟ پس کتاب ها رو مینویسن برای چی ؟ برای کی ؟
بهتره به کسانی که مشکل و ضعف دارن چند تا کتاب معرفی کنید و بعد به اشکالات فنی شون جواب بدید نه اینکه دوباره کاری انجام بشه!