سؤال

أعلم أن المنشور طويل ولكنه يحتوي أيضًا على حلول مقترحة لمشكلتي. لذلك ، فإن السؤال نفسه ليس طويلًا ... لا تخاف. قون

الرجاء مساعدتي في السيناريو التالي:

سيكون لدي خادم SQL حيث سأقوم بتخزين مجموعات البيانات. سيكون لدي أيضًا مجموعة من عملاء الكمبيوتر (جميعهم مع خادم SQL المحلي الخاص بهم) والذي سيحتاج إلى مزامنة مع الخادم. سيتم تحديد أجهزة الكمبيوتر بشكل فريد.

مثال:

لنفترض أن لدي عميلان للكمبيوتر الشخصي ، PC1 و PC2.

على الخادم ، لدي مجموعات البيانات التالية:

DS1 DS2

على أجهزة الكمبيوتر العميل ، لن يكون لدي أي شيء لتبدأ به. عندما يقوم PC1 بالاتصال بالخادم لمعرفة ما إذا كان "أي شيء جديد" ، يلاحظ أن هناك مجموعتان من البيانات تحتاج إلى استردادها حتى تقوم بتحديث قاعدة بياناتها المحلية باستخدام DS1 و DS2. سيحدث الشيء نفسه مع PC2. الآن ، دعنا نقول PC2 ، محليًا ، يعدل DS2. عندما يقوم PC2 بالاتصال بالخادم ، سيتم تحديث DS2 على الخادم بالتغييرات التي أجراها على DS2 المحلي. أخيرًا ، عندما يتصل PC1 مرة أخرى لمعرفة ما إذا كانت هناك أي تغييرات ، ستلاحظ أن DS2 قد تغير وسيقوم باسترداده ويكتبه DS2 المحلي مع DS2 من الخادم.

لا تقلق بشأن مشاكل التزامن لأنه لا يمكن لجميع أجهزة الكمبيوتر تغيير أي مجموعة بيانات. يمكن لمالك مجموعة بيانات معينة فقط تغييره (يتم تعريف المالك على أنه جهاز كمبيوتر واحد.)

فكرت في بعض الحلول لكنها لا تبدو فعالة للغاية ؛ ربما سيكون لدى شخص آخر بعض الأفكار.

الحل الأول:

على الخادم ، سأقوم بإنشاء جدول يسمى "Synctable" حيث سأكتب أي تغييرات على مجموعات البيانات.

مثال:

لنفترض أن PC1 يحتاج إلى استرداد DS1 و PC2 يحتاج إلى استرداد DS4 و DS5.

سيحتوي جدول المزامنة على:

PC1 DS1
PC2 DS4
PC2 DS5

لذلك ، عندما يتصل PC2 بالخادم ، فإنه ينظر إلى هذا الجدول ، يلاحظ أنه يحتاج إلى تنزيل DS4 و DS5 ، ويمضي قدماً ويفعل ذلك ثم يحذف إدخالاته من جدول الخادم. وبالتالي ، فإن جدول الخادم سيحتوي فقط على "PC1 DS1" بعد مزامنة PC2 نفسه. في المرة القادمة ، عندما يتصل PC2 ، يلاحظ أنه لا توجد إدخالات لذلك وبالتالي يعرف أنها "محدثة". عندما يتصل PC1 ، سيحدث نفس الشيء بالضبط: ستلاحظ أنه يحتاج إلى تنزيل DS1 وتنزيله ثم حذف الإدخال.

المشكلة في ذلك هي أنه إذا كان هناك 10 000 جهاز كمبيوتر ، وربما 5000 مجموعة بيانات تم تعديلها ، فسوف يكون لدي الكثير من الإدخالات في هذا الجدول.

سيكون الحل الثاني هو تخزين طابع زمني معدّل مرتبط بكل مجموعة بيانات. المشكلة في ذلك هي أن أجهزة الكمبيوتر العميل يجب أن تمر بجميع سجلاتها المحلية ومقارنة الطابع الزمني المحلي مع آخر طابع زمني على الخادم لمعرفة ما إذا كانت هناك أي تغييرات. لست متأكدًا من مدى كفاءة هذا الأمر عددًا كبيرًا من السجلات. يبدو أنه سيكون من الأفضل لو كانوا يعرفون مباشرة أين يبحثون عن التغييرات بدلاً من الذهاب إلى جميع السجلات في كل مرة ...

لذلك ، هل لديك أي اقتراحات حول هذا؟

التكنولوجيا المستخدمة: MS SQL Server Compact Edition 3.5 على أجهزة الكمبيوتر العميل و MySQL على الخادم. سيتم الاتصال من خلال خدمات الويب. لذلك ، دمج النسخ المتماثل/الوصول إلى البيانات عن بُعد.

شكرًا!

هل كانت مفيدة؟

المحلول

أنت تفكر في خيارين

  1. إنشاء قائمة بالتحديثات المطلوبة في وقت التعديل ، يسأل العميل "ما هو في قائمة التحديثات الخاصة بي"؟
  2. الحفاظ على الطوابع الزمنية بحيث يمكن للعميل أن يسأل "آخر وقتي لـ DSX هو ... ، هل أحتاج إلى تحديث؟"

أرى الخيار 2 كما هو أفضل. أعتقد أنه أكثر مرونة في المشكلات ، والانتعاش من حوادث العميل وما إلى ذلك. وذلك لأن كل مشارك يحتفظ فقط بما يعرفه: تاريخ بياناته. لا يحتاج الخادم إلى "فهم" من أخذ ماذا.

أعتقد أنه يمكنك تحسين تحديد ما يجب تحميله. أنت تتحدث كما لو أن العميل يحتاج إلى التكرار من خلال جميع مجموعات البيانات ، واسترداد كل ختم مرة واحدة في وقت واحد ، واتخاذ قرار لاسترداده. بدلاً من ذلك ، يمكن أن يكون لديك مكالمة خدمة ويب:

I have DS1=<time>, DS2=<time> ...; which do I need to download?

يتم اتخاذ القرار الفعلي من قبل الخادم على أساس البيانات التي يرسلها العميل ، بدلاً من العميل الذي يحضر البيانات للسماح لها باتخاذ القرار نفسه.

في المرور ، أود أن أشير إلى أن هناك منتجات تجارية من التعامل مع كل هذا. هل تحتاج حقًا إلى ترميزه؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top