PDA

View Full Version : سوال: ادغام دو دیتابیس مجزا و کاملا مشابه



sinasaffar
جمعه 22 خرداد 1394, 16:51 عصر
با سلام و عرض ادب خدمت دوستان؛
در زمینه سوالی که دارم میپرسم خیلی تحقیق کردم اما چون احتمالا درست این کار رو انجام ندادم، به جواب نرسیدم. لطف میکنید اگه راهنمایی کنید.
ما یه نرم افزار داریم که یه دیتابیس داره، اما شاید تصمیم گرفتیم چند نفر به صورت مجزا روی اون کار کنند. در واقع یه نسخه اصلی دیتابیس به چند نفر داده میشه و بقیه اطلاعات خود را اضافه میکنند. سپس در بازه های منظم یک هفته ای دیتابیس ها جمع آوری شده و در دیتابیس اصلی ادغام میشوند. در این بین، تکراری ثبت نشدن یک رکورد خاص توسط چند نفر متفاوت قابل اجتناب نخواهد بود. بعد از ادغام نیز دیتابیس نهایی به دوستان عودت شده و روز از نو روزی از نو!
1- آن چند دیتابیسی از دوستان میرسد در ساختار اصلی کاملا مشابه اند و تفاوت آنها در رکوردهایی که در چند جدول مجزا قرار دارند.
2- مطمئنا نمیخواهیم علی رغم تکراری ثبت شدن رکورد ها توسط چند نفر، پس از ادغام در دیتا بیس اصلی رکورد‌های تکراری داشته باشیم.
3- چون این کار احتمالا منظم انجام میشود روشی را بفرمایید که برای ادغام چند دیتابیس و آنهم زود به زود، بدون درد و خونریزی انجام شده و هر هفته یا هر ماه و ... دچار فرسایش روحی روانی نشویم!

جهت اطلاع عزیزان و در واقع افزایش انگیزه برای راهنمایی و کمک عرض کنیم که دیتابیس مربوط به یک سیستم وساطت برای ازدواج بوده و رکورد ها نیز همان افراد مجرد! این تکمیل اطلاعات نیز توسط چند واسطه متفاوت اتفاق می افتد که از یکدیگر دورند ولی به اطلاعات هم نیاز دارند.
در ضمن اطلاعات بنده واقع کم است در دیتابیس و در نهایت به مقداری گوگل کردن اطلاعات محدود میشود لذا بیشتری چیزی که مد نظر است و تقاضا دارم دوستان به آن عنایت داشته باشند، یه راهنمایی Walk through وار است (همان گام به گام خودمان :) )

کلا اگر ایده خاصی و متفاوتی برای پوشش دادن هدف ما دارید به شدت استقبال میکنیم.

ممنون از همکاری شما

mojtabamalaekeh
جمعه 22 خرداد 1394, 17:38 عصر
سلام
اگر Wizard خود Access رو بخواین استفاده کنید این لینک (http://www.ehow.com/how_8525970_merge-microsoft-access-databases.html) خوبه ولی برای اینکه رکورد تکراری ثبت نشه، بجای مرحله 4 باید کد SQL کوئری رو یه WHERE بهش اضافه کنید.
مثلا این کد

INSERT INTO Table1 ( fName )
SELECT Table11.fName
FROM Table11 where Table11.fName not in (select fName from table1);
برا وقتی هست که
- جدول Table1 از قبل موجود بوده
- جدول Table11 با Wizard اضافه شده
- هدف ما کپی کردن مقدار فیلد fName از Table11 به Table1 است
- با استفاده از شرط WHERE، از ثبت مقادیر تکراری فیلد fName جلوگیری شده.

بستگی داره اون اطلاعاتی که میخواین تکراری نباشه چی هست؟ اسم و فامیله؟ کد ملیه؟ چیه که نباید تکراری باشه؟

ولی روش دستی که خودتون باید کدنویسی کنید اینه که به هر جدول یه فیلد اضافه کنید که وقتی رکوردی ثبت (Add) یا دچار تغییر (Update) میشه، مقدارش به روز بشه.
مثلا اگر فیلد از نوع Boolean باشه True کنید یا اگر از نوع DateTime باشه، تاریخ آخرین بروزرسانی رکورد توش ذخیره بشه.
اینجوری زمانی که دیتابیس ها جمع میشن برا یکپارچه شدن، فقط رکوردهای به روز شده رو از هر دیتابیس فیلتر می کنید.
برای جلوگیری از ذخیره ی داده ی تکراری هم روش های مختلفی هست که در عمل و با توجه به ساختار بانکهاتون میشه بهینه ترین روش رو انتخاب کرد.

تعداد بانک هاتون زیاد باشه بهتره برنامه نویسی کنید.
زیاد یعنی چندتا؟
یعنی اونقدر که روش Wizard توی خود MS Access براتون خسته کننده باشه.

sinasaffar
جمعه 22 خرداد 1394, 23:20 عصر
سلام
اگر Wizard خود Access رو بخواین استفاده کنید این لینک (http://www.ehow.com/how_8525970_merge-microsoft-access-databases.html) خوبه ولی برای اینکه رکورد تکراری ثبت نشه، بجای مرحله 4 باید کد SQL کوئری رو یه WHERE بهش اضافه کنید.
مثلا این کد

INSERT INTO Table1 ( fName )
SELECT Table11.fName
FROM Table11 where Table11.fName not in (select fName from table1);
برا وقتی هست که
- جدول Table1 از قبل موجود بوده
- جدول Table11 با Wizard اضافه شده
- هدف ما کپی کردن مقدار فیلد fName از Table11 به Table1 است
- با استفاده از شرط WHERE، از ثبت مقادیر تکراری فیلد fName جلوگیری شده.

بستگی داره اون اطلاعاتی که میخواین تکراری نباشه چی هست؟ اسم و فامیله؟ کد ملیه؟ چیه که نباید تکراری باشه؟

ولی روش دستی که خودتون باید کدنویسی کنید اینه که به هر جدول یه فیلد اضافه کنید که وقتی رکوردی ثبت (Add) یا دچار تغییر (Update) میشه، مقدارش به روز بشه.
مثلا اگر فیلد از نوع Boolean باشه True کنید یا اگر از نوع DateTime باشه، تاریخ آخرین بروزرسانی رکورد توش ذخیره بشه.
اینجوری زمانی که دیتابیس ها جمع میشن برا یکپارچه شدن، فقط رکوردهای به روز شده رو از هر دیتابیس فیلتر می کنید.
برای جلوگیری از ذخیره ی داده ی تکراری هم روش های مختلفی هست که در عمل و با توجه به ساختار بانکهاتون میشه بهینه ترین روش رو انتخاب کرد.

تعداد بانک هاتون زیاد باشه بهتره برنامه نویسی کنید.
زیاد یعنی چندتا؟
یعنی اونقدر که روش Wizard توی خود MS Access براتون خسته کننده باشه.

سلام
ممنونم از توجه شما

1- این چیزهایی که گفتید از واک ترو کمی بالاتر نبود؟ :) آقا من واقعا ابتدایی هستم در این زمینه و فقط چون مجبورم باید سر در بیارم لذا به هیچ عنوان تجربه پیشین ندارم! حتی نمیدانم این چند خط کد را کجا باید بزنم!!!
2- این اطلاعات هر فرد همه این چیزهایی که گفتید میتونه باشه، بعلاوه چیزهای بیشتر،‌ هر فرد که یک ردیف رو تشکیل میده در جدول، کلی اطلاعات مجزا داره واسه خودش. حالا ممکنه این اطلاعات رو دو نفر از واسطه ها بزنن که خوب باید کاری کنیم که در دیتا بیس نهایی فقط یکی باشه.
3- این دیتابیس ها احتمالا حداکثر 4 تا خواهند بود.
4-من چجوری میتونم با ویزارد جدول اضافه کنم؟ قبلا تو همون ٍeHow خونده بودم اما موفق نشده بودم!
5- فیلد چه جزئی از دیتابیس رو شامل میشه؟ (یعنی این قدر نابلدم متاسفانه :( )
6- در مورد اضافه کردن فیلد الان کلی اطلاعات داریم از قبل، که بلد نیستم اضافه کنم و این پروسه باید طوری باشه که قبلی ها رو هم پشتیبانی کنه! تازه اگه بدونم چطوری این بولین که میگید رو ردیفش کنم!
7- اتفاقا با برنامه نویسی واقعا موافقم اما کاش راه و چاه رو بلد بودم!

pbm_soy
شنبه 23 خرداد 1394, 02:06 صبح
دوست عزیز در سوال گفتند که چند تا دیتابیس نه اینکه چند تا جدول! در جوابی که دادید شما در یک دیتابیس مقادیر یک جدول را در جدول دیگری کپی میکنید

اطلاعات بیشتری بدید: دیتابیس شما از چه نوعی است اکسس یا Sql server ویا چیز دیگه است؟ در هر دیتابیس چه جداولی دارید؟
اگر Sql server است با اتچ کردن دیتابیسها به Sql Server میتوانید با استفاده از امکانات خود Sql server استفاده کنید به عنوان مثال دوستان دیگرتون در سیستمهای خودشون از دیتابیس Backup بگیرند و شما فایل backup را در دیتابیس سیستم خودتون restore کنید و یا دوستانتون از اطلاعات دیتابیسشون Sql script generate کنند و شما فقط آن اسکریپت را بروی دیتابیس خودتون اجرا کنید باعث میشه رکوردهای جداول دیتابیس دوستانتون به جداول دیتابیس شما اضافه شوند و یا راههای دیگر....

یا اینکه با یک زبان برنامه نویسی برنامه ای بنویسید که دیتابیس اصلی و دیتابیس دوم را باز کند و کل اطلاعات دیتابیس دوم را به دیتابیس اصلی کپی کند

pbm_soy
شنبه 23 خرداد 1394, 02:20 صبح
اوه ببخشید من حواسم نبود تو بخش Access سوال را مطرح کرده اید پس دیتابیس شما هم اکسس است

بنظرم راه حل ساده روش دستی است جدول دیتابیس دوم را باز کنید رکوردها را انتخاب کنید و کپی بزنید سپس در دیتابیس اصلی در انتهای جدول کلیک راست و paste بزنید

البته روش Backup و Restore هم جواب خواهد داد

mojtabamalaekeh
شنبه 23 خرداد 1394, 11:28 صبح
1- اون کدها توی مرحله آخر ـ قبل از اجرای کوئری ـ باید عبارت شرطی بهش اضافه بشه.
2- اگه اطلاعاتی که هر دو واسطه میزنن عین هم باشه که کار راحته. وگرنه بهتره یک برنامه ساخت که موقع مشاهده رکوردهای تکراری به مسئول ادغام بانک ها، پیشنهاد بده کدوم رکورد انتخاب بشه برای ثبت در بانک اصلی.
3- تعداد دیتابیس ها که کمه. ولی تعداد رکوردهایی که هر سری ثبت میشه یا تغییر داده میشه هم شرطه! که اگه تعداد رکوردها هم کم باشه کار به صورت دستی انجام خواهد شد.
4- من Access 2010 دارم که هرچی توی eHow گفته بود دقیقا همون شکلیه و هیچ فرقی نداره.
5- فیلد یعنی هر مشخصه از رکورد مثل نام یا تاریخ تولد. مثل ستون توی جدول :)