تبلیغات :
آکوستیک ، فوم شانه تخم مرغی، صداگیر ماینر ، یونولیت
دستگاه جوجه کشی حرفه ای
فروش آنلاین لباس کودک
خرید فالوور ایرانی
خرید فالوور اینستاگرام
خرید ممبر تلگرام

[ + افزودن آگهی متنی جدید ]




صفحه 2 از 3 اولاول 123 آخرآخر
نمايش نتايج 11 به 20 از 30

نام تاپيک: جلوگیری از ویرایش یک رکورد تو سط چند تا کلاینت

  1. #11
    ناظر انجمن .NET Framework _H2_'s Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    یک جایی بین Framework و نارمک!
    پست ها
    4,746

    پيش فرض

    سلام
    من بودم فقط فیلد primarykey را autonumber میگذاشتم تا تضمین کند در حال و آینده غیر تکراری است و به دو کلاینت هیچگاه یک id داده نمیشود و هیچگاه داده ها گم نخواهد شد.
    PrimaryKey=Autonumber+ReadOnly (با/ بدون نمایش به کاربر)

    هیچ سطر دیگری در حال و حتی آینده ان primarykey را نخواهد داشت.
    در اصلی مثل "کد ملی" ما میماند که اگر طرف بمیرد هم تکرار نمیشود و هر سطر شما موجود یا حذف شده autonumber خودش را دارد.
    تمام اعمال ویرایشی در هسته بانک هم با کمک primarykey ها انجام میشود و بقیه فیلدها (اگر برنامه درست طراحی شود) نباید مهم باشند.
    چون primarykey این تیپی غیر قابل تغییر است، تضمین میکند هر عملیات DELETE-UPDATE-INSERT در هر زمانی و با هر اختلاف زمانی دقیقاً مختص همان سطر که به نوعی "کدملی" دارد انجام شود و دیگر زمان مهم نخواهد بود.

    =====

    چهار حالت اساسی که بیشتر نداریم؟

    اگر بعد از هر عملیاتی (که مدام در سرور درحال انجام است) کلاینتی هر لحظه دستور ...

    - SELECT دهد که آخرین محتویات همان لحظه را مشاهده میکند!
    ایرادی دارد؟ نباید ببینید؟ بانک اطلاعاتی باید علم لدونی داشته باشد و محتویات 5 دقیقه بعد را نشان دهد؟ مشکل کجا است.


    - دستور INSERT بدهد که ربطی ندارد و هربار یک autonumber جدید و منحصر به فرد میگیرد و موتور بانک تضمین کرده که با هر تعداد کلاینت و همزمان اجرا شود autonumber خودشان و غیر تکراری بگیرند.
    و تمام دستورات قبلی روی این مورد بی اثر است. بازم من مشکلی نمیبینم.


    - دستور DELETE بدهد که چون هر سطر "کدملی" مانند خودش را دارد دقیقاً همان سطر حذف میشود.
    فرقی هم ندارد چند لحظه قبل فردی ان را ویرایش UPDATE کرده یا سطر تازه درج (INSERT شده باشد.
    یک نفر دستور DELETE یک سطر کاملاً مشخص و منحصر بفرد را داده بالاخره شما میخواهید انجامش دهید؟ یا الآن یا 5 دقیقه بعد چه فرقی دارد؟ باید این دیتا حذف شود!


    - دستور UPDATE بدهد که اگر سطر تازه INSERT شده باشد که ایرادی ندارد و اگر هم سطر قبلاً DELETE شده باشد باز هم ایرادی ندارد.
    یک نفر که اجازه اش را داده تشخیص داده این سطر باید حذف شود، برنامه شما نباید فرمانش را انجام دهد؟؟؟
    چون دیگر سطری وجود ندارد UPDATE-WHERE اصلاً برقرار نشده و چیزی چه اشتباهاض و چه صحیح تغییر نخواهد کرد.
    (البته برنامه میتواند پیغامی مبنی بر عدم یافتن اطلاعات بدهد)
    بالاخره تقصیر کسی نیست که یک نفر مجوز داشته و تشخصیص داده این بخش باید حذف شود!

    ولی نمیتونه جلوی تداخل اطلاعات رو بگیره
    سعی میکنم تا شب با یک مثال شهودی تر از فاکتور و کالاهای فاکتور برایتان بیشتر توضیح دهم و یک سری از شرایط خاص را هم توضیح دهم.

  2. #12
    اگه نباشه جاش خالی می مونه MTPROG's Avatar
    تاريخ عضويت
    Sep 2007
    محل سكونت
    شهر 3500 ساله
    پست ها
    432

    پيش فرض

    بحث هایی که درباره primarykey ها کردید قبول دارم خود من هم تمام کلیدها و ایدیها رو با AutoNumber بدست میارم

    بحث سر اینکه کلید تکراری به وجود بیاد یا نه نیست

    بحث سر ارتباط بین جدولها است مثلا جدول فاکتورها ممکنه با چند تا جدول دیگه مثلا جدول پرداخت و چکها و صندوق و جدول ایندکس ارتباط داشته باشه

    حالتی که شما گفتید برای یک جدول هیچ مشکلی نداره ولی وقتی به صورت منطقی بین جدولها ارتباط برقرار کردی مشکل به وجود میاد چون با تغییر یک فاکتور جندین جدول دیگه با فاکتور مربوطه ارتباط دارن تغییر میکنن

    اگر روی یک فاکتور دو نفر ویرایش کنن و یک نفر حذف کنه(تقریبا همزمان) هر کدوم بسته به نیازشون ارتباط بین جدولها رو تغییر میدن و در این صورت ممکنه حالتهای غیر قابل پیش بینی تو برنامه به وجود یاد

    به هر حال منتظر برنامه تون هستم
    Last edited by MTPROG; 02-09-2009 at 15:22.

  3. #13
    ناظر انجمن .NET Framework _H2_'s Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    یک جایی بین Framework و نارمک!
    پست ها
    4,746

    پيش فرض

    سلام
    من سعی همانطور که گفتم با مثال روشن تر و موردی یک نمونه را با توضیح برایتان باز کنم.
    فعلاً تا من وقت کنم و بتایپم(!) اگر توانستید یک مورد از نمونه زیر مثال بزنید تا به جای بحث کلی بتوانیم موردی و برای نمونه بررسی دقیق تری کنیم و بحث مفید تر شود:
    ...هر کدوم بسته به نیازشون ارتباط بین جدولها رو تغییر میدن ...

  4. #14
    اگه نباشه جاش خالی می مونه MTPROG's Avatar
    تاريخ عضويت
    Sep 2007
    محل سكونت
    شهر 3500 ساله
    پست ها
    432

    پيش فرض

    اگر توانستید یک مورد از نمونه زیر مثال بزنید تا به جای بحث کلی بتوانیم موردی و برای نمونه بررسی دقیق تری کنیم و بحث مفید تر شود:

    نقل قول:
    ...هر کدوم بسته به نیازشون ارتباط بین جدولها رو تغییر میدن ...
    منظورتون نمونه سورسه یا همینجا توضیح بدم؟

  5. #15
    ناظر انجمن .NET Framework _H2_'s Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    یک جایی بین Framework و نارمک!
    پست ها
    4,746

    پيش فرض

    سلام
    میبخشید ویندوز عوض کردم، کمی الاف شدم ... !

    سه جدول زیر را در نظر بگیرید ...
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    رابطه جداول هم کاملاً مشخص است.
    دو جدول اول با فیلد کلیدشان با جدول سوم ارتباط دارند.
    (
    پیشنهاد میکنم برای سادگی بحث و رفع مشکل، شما هم اگر مثال و ابهامی داشتید روی همین مدل سه جدولی فوق با همین فیلدها توضیح داده و بحثتان را مطرح کنید.
    )


    حالا وضعیت های مختلف را بررسی میکنیم:
    ----- زمان اضافه کردن فاکتور جدید (Invoices-INSERT)
    شما سطر را در دیتابیس INSERT میکنید و یک ID_Invoice صدردصد سالم و منجحصر به فرد و مخصوص همین فاکتور میگیرد.
    بعد هم تک تک کالاها را با توجه به کدشان که ID_Good باشد و شماره فاکتور که ID_Invoice باشد (و از مرحله قبل گرفته اید) به جدول Invoices_Goods اضافه میکنید.
    چون ID_Invoce منحصر به فرد است با سایر برنامه های شبکه هم مشکلی ایجاد نمیشود.

    ----- زمان تغییر موارد فیلدهای فاکتور در جدول اصلی (Invoices-UPDATE)
    چون تمام ارتباط جدول فوق با جدول Invoices_Goods با فقط و فقط ID_Invoice اش است و آن هم اصلاً کاربر نمیبینید و قابل تغییر هم نیست هر تغییری در سطح جدول Invoices مشکلی ایجاد نمیکنم و نیازی به تغییر و نگرانی برای جدول نظیر Invoices_Goods وجود ندارد!
    باز هم چون ID_Invoce منحصر به فرد است بقیه برنامه های شبکه هم کار خودشان را میکنند.
    هر کسی زودتر فاکتور را ویرایش کند و ذخیره کند، تا همان لحظه ویرایش او ذخیره میشود.

    مثلاً
    کسی تاریخ فاکتور را 1388 گذاشته و Save کند، ذخیره میشود، پشت او کسی فاکتور را 1350 بگذارد و چند میلی ثانیه بعد ذخیره کند، خوب مقدار جدید ذخیره میشود، کاملاً هم منطقی نیست. ایرادی میبینید؟؟؟

    اگر هم کسی بعد از ویرایش ما فاکتور را Delete کند، خوب فرمان داده و حذف میشود! اگر هم قبل از ذخیره تغییرات کس دیگری Delete کند، چون کلید منحصر است شرط Update-Where بعدی بدون شک سطری نمی یابد و چیزی را تغییر نمیدهد.
    یک نفر که مجوز داشته حذفش کرده، به برنامه ارتباطی ندارد!


    ----- زمان حذف کلی یک فاکتور (Invoices-DELETE)
    چون کلید منحصر به فرد است، اگر کسی قبش ویرایش و یا حذف کرده باشد، مشکلی ایجاد نمیشود.
    یا کلید وجود دارد که دستور Delete حذفش میکند یا قبلاً و زودتر کسی حذفش کرده که Delete-Where دیگری چیزی برای حذف پیدا نمیکند.

    طبیعتاً بعد از حدف فاکتور اصلی باید زیر مجموعه های Invoices_Goods هم حذف شود که برای انها هم دقیقاً همین وضعیت پیش می آید و اگر کلیدشان هنوز موجود باشد، حذف خواهند شد و بعد هم تمام دستورات Delete-Where و Update-Where جاهای دیگر صادق نخواهد شد.
    (برای حذف زیر مجموعه ها میتوان از تنظیم آبشاری در زمان تعریف Relation استفاده کنید و Enforce را فعال کنید. یا میتوان از تریگرها استفاده کرد.)

    -----

    واقعاً من مشکلی نمیبینم؟ اگر تردیدی دارید مطرح کنید.
    اگر فکر میکنید مشکلی ایجاد میکند شرح دهید؟

    مهم برای برنامه ان است که تداخل پیش نیایید و مثلاً اگر سطر حذف شود و کسی Update کند ...
    - اصلاً مهم نیست و کاملاً منطقی است که سطر حذف شده و Update دیگر معنی ندارد و نباید انجام شود (کسی انتظار دیگری ندارد!)
    - ولی نباسید چنین شود که چون سطر اصلی را نیافته سطر اشتباهی دیگری را تغییر ندهد. (این است که باید در برنامه تضمینش کنید.)

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


    موفق باشید.

  6. #16
    اگه نباشه جاش خالی می مونه MTPROG's Avatar
    تاريخ عضويت
    Sep 2007
    محل سكونت
    شهر 3500 ساله
    پست ها
    432

    پيش فرض

    وقتی در حال ویرایش یک فاکتور هستید که دارای 6 قلم کالا است قبل از اینکه ویرایش شما تموم بشه این فاکتور با 6 قلم کالا توسط کسی دیگه کلا حذف میشه

    حالا کاربری که در حال ویرایش هستش اگر همون 6 فیلد باشه خوب به قول شما Update Where چون برقرار نیست عمل نمیکنه
    اما اگر این 6 قلم کالا تبدیل به 8 قلم بشه و دو کالای جدید به لیست ویرایش اضافه بشه دیگه عمل Insert به ازای 2 رکورد انجام میشه و چون عمل درج هستش پس اجام میشه
    اینو چطوری حل میشه؟

  7. #17
    ناظر انجمن .NET Framework _H2_'s Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    یک جایی بین Framework و نارمک!
    پست ها
    4,746

    پيش فرض

    سلام
    حالا کاربری که در حال ویرایش هستش اگر همون 6 فیلد باشه خوب به قول شما Update Where چون برقرار نیست عمل نمیکنه
    اما اگر این 6 قلم کالا تبدیل به 8 قلم بشه و دو کالای جدید به لیست ویرایش اضافه بشه دیگه عمل Insert به ازای 2 رکورد انجام میشه و چون عمل درج هستش پس اجام میشه
    اینو چطوری حل میشه؟
    خوب تازه حالا این شد یک چیزی!!!
    این در تعریف اختلال میگنجد و دقیقاً شرح های منطقی این تیپی مد نظر من بود که گفتم اگر تردیدی دارید بیان کنید.

    اما راه حل:
    کافی است در دستابیس بین جداول Relation تعریف کنید که البته SQLServer انها را Diagram هم می نامد.
    در زمان تعریف و یا بعد ان همه گزینه های اجباری را فعال کنید:
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    (مورد آخری با فیلدهای AutoNumber برای PrimaryKey چندان لازم نیست)
    با این تنظیمات SQLServer تضمین میکند که هیچگاه امکان ندارد همچین تداخلهایی رخ دهد.

    اگر هم سطری در رابطه بالاسری (والد) حذف شود، خودکار همه زیر مجموعه ها (فرزندان) را خود SQLServer پاک میکند.
    (یعنی با حذف سطر جدول Invoices همه سطرهای نظیر Invoices_Goods هم حذف خواهد شد و شما لازم نیست کاری کنید.)

    اگر هم دستور INSERT ای بیاید که نظیر کلید بالاسری اش (والد) وجود نداشته باشد، SQLServer دستور INSERT و یا UPDATE که همچین وضعیتی را میخواهد ایجاد کند انجام نمیدهد و به ریسمان مذکور یک اثتثنا (همان خطای خودمان!) ارسال میکند.

    ... عمل Insert به ازای 2 رکورد انجام میشه و چون عمل درج هستش پس اجام میشه ...
    پس با فعال کردن گزینه های مذکور در دیتابیس و با در نظر گرفتن شرایط منطقی (که شما به خوبی تشریح کردید) کلایت دوم که خطا دریافت خواهد کرد و فقط کاری که شما باید در کدنویسی انجام دهید آن است که دستور Try برای عملتان قرار دهید و در Cacth نوع کلاس خطای مذکور را هندلر کنید و پیغام خطای مناسب فارسی را در قالب یک MsgBox نمایش دهید.

    اگر موارد منطقی و استدلالی دیگر از این دست به ذهنتان رسید بیان کنید.

  8. #18
    اگه نباشه جاش خالی می مونه MTPROG's Avatar
    تاريخ عضويت
    Sep 2007
    محل سكونت
    شهر 3500 ساله
    پست ها
    432

    پيش فرض

    خیلی عالی بود ممنون

    فکر کنم این پست آخر ارزش کل این تاپیک رو داشت

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

  9. #19
    اگه نباشه جاش خالی می مونه MTPROG's Avatar
    تاريخ عضويت
    Sep 2007
    محل سكونت
    شهر 3500 ساله
    پست ها
    432

    پيش فرض

    من تو برنامه خودم 8 نوع فاکتور دارم
    جهت ذخیره لیست این 8 نوع فاکتور از یک جدول به نام List_factor استفاده کردم و یک فیلد به نام State وجود دارد که نوع فاکتورها رو مشخص می کنه مثلا :
    فاکتور شماره 1 با State مقدار 0 مربوط به فروش
    فاکتور شماره 1 با State مقدار 5 مربوط به خرید

    یعنی در این جدول ممکنه 8 تا شماره 1 وجود داشته باشه ولی اگر فیلد state اونها رو حساب کنی به ازای هر نوع فاکتور یک شماره وجود داره

    آیا این روش باعث به هم خوردن Relation نمیشه(چون فیلد یکتا نیست)؟

    اگر نمیشه پس باید از 8 تا جدول استفاده بشه که کار رو طولانی تر میکنه!
    اگر از یک جدول استفاده بشه و فیلد شماره فاکتور یکتا باشه شماره فاکتورها پراکنده میشه مثلا
    1 تا 10 فروش
    11 برگشت از فروش
    12 تا 15 خرید
    ...
    که اینم زیاد جالب نیست
    شما چه روشی رو پیشنهاد میکنید؟

  10. #20
    ناظر انجمن .NET Framework _H2_'s Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    یک جایی بین Framework و نارمک!
    پست ها
    4,746

    پيش فرض

    سلام
    برای برنامه شبکه ای و حداکثر تضمین صحت کارکرد شبکه ای، استفاده از Autonumber-PrimaryKey میتوانید خیلی کمک کند و حلال مشکلات باشد.
    در ضمینه همین تداخل ها که بحث کردیم، من خودم در طی سالها بارها و در شرایط گوناگون (که الا« به ذهنم خودم هم نمیرسد!) این مسئله را تحلیل کرده بودم ولی برای همه موارد توجیح و راه حلی منطقی در Autonumber-PrimaryKey یافتم.

    =====

    من همچنان پیشنهاد میکنم PrimaryKey حقیقی و واقعی جدول در دیتابیس و برنامه (جهت ارجاع و عملیات) همان Autonumber باشد.
    اینطوری مشکل شبکه و چند ریسمانی و برنامه نویسی اش خیلی ساده میشود و شما به عنوان برنامه نویس باید به موارد کمتری فکر کنید و ساده تر میتوانید کدنویسی کنید.

    ولی میتوانید این فیلد اصلی را هیچ کجا نشان ندهید و به اقتضای منطق برنامه و شرایط و درخواست مشتریتان، بیایید و فیلدهای شبه primarykey و الکی از نظر برنامه نویسی برای او اضافه کنید ولی با ایندکس یکتا در دیتابیس تضمین کنید که تکراری نشود.

    =====

    یعنی خلاصه آنکه ...
    پیشنهاد میکنم Autonumber-PrimaryKey را همچنان قرار دهید و با ان در دیتابیس و برنامه کار کنید و relation بدهید ولی برای کاربر من شرایط برنامه شما را نمیدانم...
    - اگر راه دارد و برای شرایط کاری برنامه منطقی است یک فیلد شماره فاکتور اضافه کنید که کلاً و بدون در نظر گرفتن State یکتا باشد.
    (در این شرایط شاید بتوانید شماره فاکتور را با ان autonumber یکی کنید.)

    - اگر مورد بالا برای شرایط کاری برنامه منطقی نیست و باید هر نوع شماره های خودش را داشته باشد، خوب فیلد شماره فاکتور را با جفت State با هم UniqueIndex معرفی کنید.

    با این شرایط کاربر برنامه هر موقع عشقش کشید میتوانید شماره فاکتور یا State را هم اصلاح کنید و همه چیز هم به ظاهر او قابل ویرایش و تغییر مجدد باشد.

Thread Information

Users Browsing this Thread

هم اکنون 1 کاربر در حال مشاهده این تاپیک میباشد. (0 کاربر عضو شده و 1 مهمان)

User Tag List

برچسب های این موضوع

قوانين ايجاد تاپيک در انجمن

  • شما نمی توانید تاپیک ایحاد کنید
  • شما نمی توانید پاسخی ارسال کنید
  • شما نمی توانید فایل پیوست کنید
  • شما نمی توانید پاسخ خود را ویرایش کنید
  •