ঠিক আছে, আসুন এটি ভেঙে দিন:
- একাধিক ডাটাবেসে দুটি টেবিলের মধ্যে কীভাবে যুক্ত হয়? (এখানে একটি কোড উদাহরণ সহায়ক হবে)।
এই বেশ সহজ. এসকিউএল অবজেক্টগুলির এক থেকে চার অংশের নামকরণ কনভেনশন থেকে যে কোনও জায়গায় থাকতে পারে:
Servername.databasename.schemaname.tablename
যদি আপনার সমস্ত টেবিল একই ডেটাবেসে একই সার্ভারে থাকে, একই মালিক / স্কিমা সহ, আপনি কেবল প্রথম তিনটি অংশ উপেক্ষা করতে পারেন এবং আপনি যা ব্যবহার করতে চান তা ব্যবহার করতে পারেন:
Select a.*,b.* from
tableA a inner join
tableB b on a.col1=b.col1
যদি আপনার টেবিলগুলির মধ্যে একটি আলাদা ডাটাবেসে থাকে এবং উভয়ই তাদের ডাটাবেসের জন্য ডিফল্ট স্কিমা ব্যবহার করেন, তবে আপনি কেবল দ্বিতীয় টেবিলে ডাটাবেস যুক্ত করুন:
Select a.*,b.* from
tableA a inner join
databaseC..tableB b on a.col1 = b.col1
আপনি যদি জিজ্ঞাসা করছেন তার যে কোনও একটি থেকে আপনি যদি কোনও তৃতীয় ডাটাবেসে আলাদা হয়ে থাকেন তবে আপনি উভয় ডাটাবেসের নাম স্পষ্টভাবে ব্যবহার করেন:
Select a.*,b.* from
databaseD..tableA a inner join
databaseC..tableB b on a.col1 = b.col1
যদি আপনি বিভিন্ন স্কিমা এবং / বা মালিক ব্যবহার করে শেষ করেন তবে আপনি এগুলিকে যুক্ত করতে পারেন:
Select a.*,b.* from
databaseD.john.tableA a inner join
databaseC.accounting.tableB b on a.col1 = b.col1
এবং সর্বশেষে, আপনি যদি এটি সম্পর্কে খুব সাবধান হন এবং খুব ভাল কারণ থাকে তবে আপনি অন্য সার্ভারের একটি (সাধারণত ছোট) টেবিলে যোগ দিতে পারেন:
Select a.* from
databaseD.john.TableA a inner join
ATLANTA.databaseC.accounting.tableB b on a.col1 = b.col1
- 1 টি ডাটাবেস / 1 সার্ভার সেটআপের বাইরে চলে যাওয়ার সময় কখন? এটি করা কতটা সাধারণ? কোন ডাটাবেসে কোন সারণী রয়েছে তা ট্র্যাক করার জন্য কোনও বিশেষ কৌশল আছে?
আমি এই দুটি একত্রিত করব কারণ তারা একসাথে যায়। আপনার নকশা / ব্যবসায় / প্রযুক্তিগত সীমাবদ্ধতা আপনাকে আরও ব্যবহার করতে বাধ্য না করা অবধি আপনার এক ডেটাবেস এক সার্ভারই যথেষ্ট বলে ধরে নেওয়া শুরু করার জন্য প্রায় সর্বদা সাধারণ fine
প্রথমে আপনার দ্বিতীয় প্রশ্নের উত্তর দেওয়ার জন্য, যেহেতু আপনার কাছে সাধারণত পৃথক ডাটাবেস থাকার কারণ থাকে তাই এটি আপনার সিস্টেমের নকশাটি যেখানে কিছু রয়েছে তা জানা থেকে মোটামুটি স্পষ্ট হওয়া উচিত।
কখন / কেন এটি একটি একক ডাটাবেসের বাইরে যাওয়ার প্রয়োজন। সাধারণত এটি ব্যবসায়িক বিধি, রাজনীতি এবং / বা প্রযুক্তিগত কারণে মিশ্রিত হয়।
উদাহরণস্বরূপ, আমি যেখানে কাজ করি সেখানে আমাদের 4 টি সার্ভারে 16 টি ডাটাবেস ছড়িয়ে আছে। আমাদের একটি মেইনডিবি, ইমেজডিবি, রেফারেন্সেবল ডিবি, হাইভলিউম ট্রান্সজেকশনডিবি, রিপোর্টিংডিবি, স্টেজিংডিবি, প্রসেসিংডিবি, আর্কাইভডিবি, ফিনান্সিয়ালডিবি রয়েছে। এগুলি কেন আলাদা তার কয়েকটি উদাহরণ দেওয়া:
- ফিনান্সিয়ালডিবি, সংবেদনশীল তথ্য
- চিত্র ডিবি, নির্দিষ্ট বিভিন্ন স্টোরেজ এবং পুনরুদ্ধারের প্রয়োজনীয়তা
- রেফারেন্সডিবি, কম লেনদেন, উচ্চ পঠিত
- रिपोर्टিংডিবি, খুব উচ্চ পঠিত, অন্যান্য অন্যান্য তথ্যের থেকে ভিন্ন ভিন্ন অন্যান্য পরিবেশে পুনরুদ্ধার / পুনরুদ্ধার করা দরকার
- স্টেজিংডিবি, স্থায়ী কিছুই নয়, কেবলমাত্র একটি বিফ আপ আপ টেম্পডিবি যা আমাদের আরও নিয়ন্ত্রণ করে
- মেইনডিবি, অন্যান্য সমস্ত ডিবি'র সাথে ইন্টারফেস রয়েছে তবে ডিফারেনশিয়াল ব্যাকআপ প্রয়োজন তাই ... আমরা বিভক্ত হয়ে যাই
- হাইভোলিউম ট্রান্সজেকশন টেবিলগুলি (যা তুলনামূলকভাবে ক্ষণস্থায়ী হয়) তাদের নিজস্ব ডিবিতে যাতে ব্যাকআপটি যুক্তিযুক্ত আকার রাখতে পারে।
- সংরক্ষণাগারভুক্ত, মেইন এবং রিপোর্টিং থেকে একই তথ্য প্রচুর, তবে দীর্ঘতর ধরে রাখার সময়সীমা এবং ডেটা আরও গভীরভাবে খনন করা শক্ততর মারধর অনুসন্ধানগুলি। যদি এখনও এটি মেইন / রিপোর্টিংয়ের সাথে একত্রিত করা হয় তবে এটি আমাদের সিস্টেমটিকে নষ্ট করবে।
• জানতে দেয় আবেদন কোড প্রয়োজন যা এক বা একাধিক ডাটাবেস একাধিক সার্ভার জুড়ে ছড়িয়ে আছেন? যদি তা না হয় তবে অনুরোধগুলি কোন স্তরে ফিল্টার করা হয়?
একটি বিস্তৃত অর্থে, তারা সম্ভবত। ডেটাবেস সংযোগ স্ট্রিংয়ে তারা কোন সার্ভারের দিকে ইশারা করছে তা ন্যূনতমভাবে তাদের জানতে হবে। প্রসেসিং, রিপোর্টিং, মেইন, ইত্যাদি
সেখান থেকে তাদের অধীনে কার্যকর করতে একটি ডাটাবেস প্রসঙ্গের প্রয়োজন। সাধারণত এটি অ্যাপ্লিকেশনটির জন্য সর্বাধিক ব্যবহৃত হতে পারে, এমনকি অ্যাপ্লিকেশনটির একটি ডাটাবেস / একটি সার্ভারের দিন থেকে এটিও আসল। আপনার কাছে প্রতিটি কলটিতে স্পষ্টভাবে ডাটাবেস প্রসঙ্গটি স্যুইচ করা যেতে পারে তবে অ্যাপ্লিকেশনটি পরিবর্তন না করে ডাটাবেস সামঞ্জস্য করা খুব শক্ত করে তোলে very
স্বাভাবিক, (বা কমপক্ষে, আমার স্বাভাবিক) সাধারণত পন্থা হ'ল সর্বদা এক বা দুটি প্রধান ডাটাবেসের মাধ্যমে অ্যাক্সেস করা।
তারপরে সঞ্চিত প্রক্রিয়াগুলির মাধ্যমে ডাটাবেসের সাথে ইন্টারফেসিংয়ের সাথে মিলিয়ে প্রয়োজনীয় অন্যান্য ডেটাবেজে ভিউ তৈরি করুন।
সুতরাং উদাহরণস্বরূপ:
ধরা যাক আপনি কোনও ক্লায়েন্টের ডেমোগ্রাফিক তথ্য, বিক্রয় ডেটা এবং ক্রেডিট ব্যালেন্স পেতে চান এবং এটি মূলত তিনটি টেবিল জুড়ে মেইনডিবিতে ছড়িয়ে পড়ে।
সুতরাং আপনি আপনার অ্যাপ্লিকেশন থেকে একটি কল লিখুন:
Select c.ClientName, c.ClientAddress, s.totalSales,f.CreditBlance from
Clients c join Sales s on c.clientid = s.clientid inner join AccountReceivable f on
c.clientid=f.clientid where c.clientid = @clientid
অসাধারণ. যাইহোক, এখন যে কোনও সময় আমরা একটি কলাম নাম পরিবর্তন করি, বা কোনও টেবিলটির নাম পরিবর্তন / সরিয়ে ফেলা করি, আপনাকে অ্যাপ কোডটি আপডেট করতে হবে। সুতরাং পরিবর্তে আমরা দুটি জিনিস করি:
ক্লায়েন্ট, বিক্রয়, অ্যাকাউন্টআরসিভিয়েবল ভিউগুলি তৈরি করুন (আপনি নির্বাচন নির্বাচন করুন না তবে আমি এখানে ডেমো করছি)
Use MainDB
GO
Create view v_Clients as select * from Clients
Create view v_Sales as select * from Sales
Create view v_AccountReceivable as select * from AccountReceivable
Go
তারপরে আমরা একটি সঞ্চিত পদ্ধতিও তৈরি করব, spGetClientSalesAR
Create proc spGetClientSalesAR @clientID int
as
Select c.ClientName as ClientName,
c.ClientAddress as ClientAddress,
s.totalSales as TotalSales,
f.CreditBlance as CreditBalance
from
v_Clients c join v_Sales s
on c.clientid = s.clientid
inner join v_AccountReceivable f
on c.clientid=f.clientid
where c.clientid = @clientid
এবং আপনার অ্যাপ্লিকেশন কল যে।
এখন যতক্ষণ না আমি সেই সঞ্চিত প্রকল্পের ইন্টারফেসটি পরিবর্তন করি না, আমি ব্যাকএন্ড ডাটাবেসে স্কেল আপ বা আউট করার জন্য আমার যা কিছু করতে হবে তা করতে পারি।
চূড়ান্তভাবে, আমি এমনকি আমার পুরানো মেইনডিবিটিকে কেবল সেলের মতো সঞ্চিত পদ্ধতি এবং এমন মতামত তৈরি করতে পেরেছিলাম যা আমাদের তৈরি করা মতামতের নীচে এর মতো দেখাচ্ছিল:
Create view v_Clients as select * from ServerX.DatabaseY.dbo.Clients
Create view v_Sales as select * from ServerQ.DatabaseP.dbo.Sales
Create view v_AccountReceivable as select * from ServerJ.DatabaseK.dbo.AccountReceivable
এবং আপনার অ্যাপ্লিকেশনটি কখনই পার্থক্যটি জানতে পারে না, (দ্রুত পাইপ এবং অন্যান্য জিনিসের মধ্যে ভাল স্টেজযুক্ত ডেটা ধরে)।
স্পষ্টতই এটি চরম এবং আমি যদি মিথ্যা বলি যে আমি সবকিছু এইভাবে পরিকল্পনা করা হয়েছিল, তবে রিফ্যাক্টরিংয়ের সময় আপনি যদি এটি করেন তবে সঞ্চিত পদ্ধতি / ভিউগুলি ব্যবহার করা আপনাকে অনেক স্বাচ্ছন্দ্যের সুযোগ দেয় কারণ আপনার অ্যাপ্লিকেশনটি তার নম্র একটি ডাটাবেস / একটি সার্ভার থেকে বাড়বে as সূচনা করে।