পোস্টগ্রিএসকিউএল: একেকটি স্কিমা সহ একাধিক ডাটাবেস, বা একাধিক স্কিমার সাথে একটি ডাটাবেস ব্যবহার করা কি ভাল?


147

আমার প্রশ্নের একটিতে এই মন্তব্যের পরে , আমি ভাবছি এটি এক্স স্কিমাস বা এর বিপরীতে একটি ডেটাবেস ব্যবহার করা ভাল।

আমার পরিস্থিতি: আমি একটি ওয়েব অ্যাপ্লিকেশন বিকাশ করছি যেখানে লোকেরা নিবন্ধভুক্ত হয় তখন আমি একটি ডাটাবেস তৈরি করি (না, এটি কোনও সামাজিক নেটওয়ার্ক নয়: প্রত্যেকেরই নিজের ডেটা অ্যাক্সেস করতে হবে এবং অন্য ব্যবহারকারীর ডেটা কখনই দেখতে পাবে না) ।

আমি আমার অ্যাপ্লিকেশনটির পূর্ববর্তী সংস্করণটির জন্য এটি ব্যবহার করেছি (এটি এখনও মাইএসকিউএলে চলছে): প্রতিটি রেজিস্ট্রেশনের জন্য প্লেস্ক এপিআইয়ের মাধ্যমে আমি করি:

  1. সীমিত সুযোগ-সুবিধা সহ একটি ডাটাবেস ব্যবহারকারী তৈরি করুন;
  2. এমন একটি ডাটাবেস তৈরি করুন যা কেবলমাত্র আগের তৈরি ব্যবহারকারী এবং সুপারভাইজার (রক্ষণাবেক্ষণের জন্য) অ্যাক্সেস করতে পারে
  3. ডেটাবেস পপুলেট করুন

এখন, পোস্টগ্র্রেএসকিউএল (প্রকল্পটি পরিণত হচ্ছে এবং মাইএসকিউএল ... সমস্ত প্রয়োজনীয়তা পূরণ করবেন না) এর সাথেও আমার একই কাজ করা দরকার।

আমার কাছে সমস্ত ডাটাবেস / স্কিমার ব্যাকআপগুলি থাকা দরকার: pg_dump উভয় উপায়েই পুরোপুরি কাজ করে এবং কেবলমাত্র একটি স্কিমা বা একটি ডাটাবেস অ্যাক্সেস করতে কনফিগার করা যায় এমন ব্যবহারকারীদের জন্য একই।

সুতরাং, ধরে নিচ্ছি যে আপনি আমার চেয়ে অভিজ্ঞ পোস্টগ্রিএসকিউএল ব্যবহারকারী, আমার পরিস্থিতি সবচেয়ে ভাল সমাধান বলে আপনি কী মনে করেন এবং কেন?

Sche x স্কিমার পরিবর্তে database x ডাটাবেস ব্যবহার করে পারফরম্যান্সের পার্থক্য থাকবে? এবং ভবিষ্যতে (নির্ভরযোগ্যতা) বজায় রাখার জন্য কী সমাধান ভাল হবে?

আমার সমস্ত ডাটাবেস / স্কিমার সর্বদা একই কাঠামো থাকবে!

ব্যাকআপ ইস্যুগুলির জন্য (পিজি_ডাম্প ব্যবহার করে) সম্ভবত একটি ডেটাবেস এবং অনেক স্কিমা ব্যবহার করা আরও ভাল, সমস্ত স্কিমাকে একবারে ডাম্প করা: পুনরুদ্ধার করা খুব সহজ হবে একটি ডেভলপমেন্ট মেশিনে মূল ডাম্প লোড করা এবং তারপরে প্রয়োজনীয় স্কিমাকে ডাম্প এবং পুনরুদ্ধার করা হবে: সেখানে এটি একটি অতিরিক্ত পদক্ষেপ, তবে সমস্ত স্কিমাকে এক এক করে ডাম্প করার চেয়ে দ্রুত মনে হয় dump

আপডেট 2012

ঠিক আছে, গত দুই বছরে অ্যাপ্লিকেশন কাঠামো এবং নকশা এত বেশি পরিবর্তিত হয়েছে। আমি এখনও one db with many schemasপন্থাটি ব্যবহার করছি , তবে এখনও আমার কাছে আমার অ্যাপ্লিকেশনটির প্রতিটি সংস্করণের জন্য একটি ডাটাবেস রয়েছে :

Db myapp_01
    \_ my_customer_foo_schema
    \_ my_customer_bar_schema
Db myapp_02
    \_ my_customer_foo_schema
    \_ my_customer_bar_schema

ব্যাকআপগুলির জন্য, আমি প্রতিটি ডাটাবেস নিয়মিত ডাম্প করছি এবং তারপরে বিকাশগুলি সার্ভারে সরাচ্ছি moving

আমি পিআইটিআর / ওয়াল ব্যাকআপটিও ব্যবহার করছি তবে, যেমনটি আমি আগেই বলেছিলাম, সম্ভবত আমাকে একবারে সমস্ত ডাটাবেস পুনরুদ্ধার করতে হবে না ... তাই সম্ভবত এটি এই বছর বরখাস্ত করা হবে (আমার পরিস্থিতিতে সেরা পদ্ধতির নয়) )।

ওয়ান-ডিবি-মাল্টি-স্কিমা পদ্ধতির জন্য এখন থেকে আমার পক্ষে খুব ভাল কাজ হয়েছে, এমনকি যদি অ্যাপ্লিকেশন কাঠামো পুরোপুরি পরিবর্তিত হয়:

আমি প্রায় ভুলে গেছি: আমার সমস্ত ডাটাবেস / স্কিমার সর্বদা একই কাঠামো থাকবে!

... এখন, প্রতিটি স্কিমাটির নিজস্ব কাঠামো রয়েছে যা ব্যবহারকারীর ডেটা প্রবাহকে পরিবর্তনশীলভাবে পরিবর্তন করে।


"আমার সমস্ত ডাটাবেস / স্কিমার একই কাঠামো থাকবে!" আপনার মানে কি তাদের সবার কাঠামো একই রকম? অথবা কখনো না?
ওসামা আল-মায়েদ

দুঃখিত, হ্যাঁ, তাদের সবার একই কাঠামো চিরকালের জন্য: আমি যদি একটি পরিবর্তন করি তবে আমি সেগুলি সবই পরিবর্তন করব;)
স্ট্রে

আপনার যদি 1000 গ্রাহক থাকে তার অর্থ আপনার 1000 টি স্কিমা আপডেট করতে হবে?
জোশুয়া পার্টোগি

@ জর্পতোগি: হ্যাঁ, তবে আমাকে কেবল টেবিলের কাঠামো আপডেট করতে হবে, ডেটা নয়।
স্ট্রে

সুতরাং, আপনি শেষ পর্যন্ত কি জন্য গিয়েছিলাম? যদিও একটি প্রশ্ন, যদিও কোয়েরি ইত্যাদির পারফরম্যান্স টেবিল স্পেসগুলি, স্কিমার মাধ্যমে মাল্টি-ডিবি বনাম মাল্টি স্কিমার সমতুল্য পারফরম্যান্সের ফলে নিয়ন্ত্রণ করা যায়, ওয়াল লগের কোনও প্রভাব ???
কপিল

উত্তর:


113

একটি পোস্টগ্রিএসকিউএল "স্কিমা" মোটামুটি মাইএসকিউএল "ডাটাবেস" এর সমান। পোস্টগ্রিজ এসকিউএল ইনস্টলেশনে অনেকগুলি ডাটাবেস থাকা সমস্যাযুক্ত হতে পারে; অনেক স্কিমা থাকা কোনও ঝামেলা ছাড়াই কাজ করবে। সুতরাং আপনি অবশ্যই সেই ডাটাবেসের মধ্যে একটি ডাটাবেস এবং একাধিক স্কিমার সাথে যেতে চান।


33
এই. পোস্টগ্রিস আপনাকে ডাটাবেসগুলিতে ক্যোয়ার করার অনুমতি দেয় না, যা বেশ বিরক্তিকর হতে পারে।
ম্যাট বি

81
"পোস্টগ্রিজ এসকিউএল ইনস্টলেশনে অনেকগুলি ডাটাবেস থাকা সমস্যাযুক্ত হতে পারে" - দয়া করে স্পষ্ট করে বলুন; এটি সাধারণভাবে বা এই নির্দিষ্ট ক্ষেত্রে সমস্যাযুক্ত এবং কেন?
আকাইহোলা

33
"একটি ডাটাবেসে একাধিক স্কিমার ব্যবহারের জন্য সর্বাধিক সাধারণ ব্যবহারের ক্ষেত্রে হ'ল একটি সফটওয়্যার হিসাবে একটি পরিষেবা অ্যাপ্লিকেশন তৈরি করা যেখানে প্রতিটি গ্রাহকের নিজস্ব স্কিমা থাকে this যদিও এই কৌশলটি বাধ্যতামূলক বলে মনে হচ্ছে, আমরা এর বিরুদ্ধে দৃ strongly়ভাবে সুপারিশ করব কারণ এটি অসংখ্য ক্ষেত্রে ঘটেছে has অপারেশনাল সমস্যাগুলি উদাহরণস্বরূপ, এমনকি একটি মাঝারি সংখ্যক স্কিমা (> 50) হিরোকুর
নীল ম্যাকগুইগান

16
@ নীলম্যাকগুইগান: মজার বিষয় হচ্ছে কুকিনের (গৃহীত) উত্তর থেকে এটি সম্পূর্ণ বিপরীত উপসংহার বলে মনে হচ্ছে।
কারবোকেশন

8
অনেক স্কিমার সাথে একটি ডেটাবেস থাকলে সেগুলির একটিও স্কিমা ডাম্প করা কার্যত অসম্ভব করে দেবে। আমি 3000 এরও বেশি স্কিমার সাথে একটি পোস্টগ্রিজ ডাটাবেস চালিয়ে যাচ্ছি এবং আপনি যদি একটি একক স্কিমা ডাম্প করার চেষ্টা করেন তবে pg_dump কেবলমাত্র মেমরির ত্রুটির সাথে ব্যর্থ হয়। আমি ভাবছি যে এর পরিবর্তে আমার 3000 ডাটাবেস থাকলে এটির কোনও আলাদা হত।
মাছিসুজি

27

অবশ্যই, আমি এক-ডিবি-বহু-স্কিমার পদ্ধতির জন্য যাব। এটি আমাকে সমস্ত ডাটাবেস ডাম্প করার অনুমতি দেয়, তবে কেবলমাত্র একটিকে খুব সহজেই পুনরুদ্ধার করতে পারে:

  1. ডিবি (সমস্ত স্কিমা) ডাম্প করুন, একটি নতুন ডিবিতে ডাম্প লোড করুন, আমার প্রয়োজন কেবলমাত্র স্কিমাটি ডাম্প করুন এবং মূল ডিবিতে পুনরুদ্ধার করুন।
  2. একে একে আলাদা করে স্কিমাটি ফেলে দিন (তবে আমি মনে করি মেশিনটি এভাবে আরও ক্ষতিগ্রস্থ হবে - এবং আমি ৫০০ স্কিমার মতো প্রত্যাশা করছি!)

অন্যথায়, চারপাশে গুগল করে আমি দেখেছি যে স্কিমার নকল করার কোনও অটো-প্রক্রিয়া নেই (এটি একটি টেম্পলেট হিসাবে ব্যবহার করে) তবে অনেকে এইভাবে পরামর্শ দেন:

  1. একটি টেম্পলেট-স্কিমা তৈরি করুন
  2. ডুপ্লিকেট করার দরকার হলে নতুন নাম দিয়ে নতুন নাম দিন
  3. ফেলে দাও
  4. এটির পুনরায় নামকরণ করুন
  5. ডাম্প পুনরুদ্ধার করুন
  6. ম্যাজিক হয়ে গেছে।

আমি এটি করার জন্য পাইথনে দুটি সারি লিখেছি; আমি আশা করি তারা কাউকে সহায়তা করতে পারে (2-সেকেন্ড-লিখিত-কোডে, উত্পাদনে এটি ব্যবহার করবেন না):

import os
import sys
import pg

# Take the new schema name from the second cmd arguments (the first is the filename)
newSchema = sys.argv[1]

# Temperary folder for the dumps
dumpFile = '/test/dumps/' + str(newSchema) + '.sql'

# Settings
db_name = 'db_name'
db_user = 'db_user'
db_pass = 'db_pass'
schema_as_template = 'schema_name'

# Connection
pgConnect = pg.connect(dbname= db_name, host='localhost', user= db_user, passwd= db_pass)

# Rename schema with the new name
pgConnect.query("ALTER SCHEMA " + schema_as_template + " RENAME TO " + str(newSchema))

# Dump it
command = 'export PGPASSWORD="' + db_pass + '" && pg_dump -U ' + db_user + ' -n ' + str(newSchema) + ' ' + db_name + ' > ' + dumpFile
os.system(command)

# Rename back with its default name
pgConnect.query("ALTER SCHEMA " + str(newSchema) + " RENAME TO " + schema_as_template)

# Restore the previous dump to create the new schema
restore = 'export PGPASSWORD="' + db_pass + '" && psql -U ' + db_user + ' -d ' + db_name + ' < ' + dumpFile
os.system(restore)

# Want to delete the dump file?
os.remove(dumpFile)

# Close connection
pgConnect.close()

14

আমি বলব, একাধিক ডাটাবেস এবং একাধিক স্কিমার সাথে যান :)

পোস্টগ্র্রেএসকিউএলএর স্কিমাগুলি অনেকটা ওরাকলে প্যাকেজের মতো, যদি আপনি সেগুলির সাথে পরিচিত হন। ডেটাবেসগুলি ডেটার সম্পূর্ণ সেটগুলির মধ্যে পার্থক্য বোঝানো হয়, যখন স্কিমাগুলি ডেটা সত্তার মতো।

উদাহরণস্বরূপ, স্কিমাস "ইউজারম্যানেজমেন্ট", "লংটার্মসস্টারেজ" এবং এর সাথে একটি সম্পূর্ণ অ্যাপ্লিকেশনটির জন্য আপনার কাছে একটি ডাটাবেস থাকতে পারে। "ব্যবহারকারীর ব্যবস্থাপনায়" তখন "ব্যবহারকারীর" টেবিলের পাশাপাশি ব্যবহারকারী ব্যবস্থাপনার জন্য প্রয়োজনীয় সমস্ত সঞ্চিত পদ্ধতি, ট্রিগার, ক্রম ইত্যাদি থাকে contain

ডাটাবেসগুলি সম্পূর্ণ প্রোগ্রাম, স্কিমার উপাদান।


4
... এবং তাই আমার কাছে স্কিমার ভিতরে 1 টি ডাটাবেস থাকবে: $ গ্রাহক 1_ ব্যবহারকারীর_সেমিমা, $ গ্রাহক 2_ ব্যবহারকারী_সেমিমা, $ গ্রাহক 3_ ব্যবহারকারীর_সেমিমা, $ গ্রাহক 1_ ডকুমেন্টস_সেমিমা, $ গ্রাহক 2_ ডকুমেন্টস_সেইমা, $ গ্রাহক 3_ ডকুমেন্টস_সেমিমা? Mh ... একটি নির্ভরযোগ্য উপায় মনে হয় না ... এবং অভিনয় সম্পর্কে কি? এবং আমার আবেদনের কোড সম্পর্কে কী হবে (পিএইচপি এবং পাইথন হবে)?
এতগুলি

7
@ স্ট্রে: আমি এটি এইভাবে পড়ছি: প্রতিটি গ্রাহকের কাছে এটির ডাটাবেস গ্রাহক 1_ড্যাটাবেস, গ্রাহক 2_ড্যাটাবেস এবং সেই ডাটাবেসের মধ্যে আপনার ইউজার_সেমি, ডকুমেন্টস_সেমিমা রয়েছে।
ফ্র্যাঙ্কোমার্স

6

পোস্টগ্রিসএসকিউএল প্রসঙ্গে আমি একাধিক স্কিমার সাথে একটি ডিবি ব্যবহার করার পরামর্শ দিই, যেমন আপনি (উদাহরণস্বরূপ) ইউনিয়ন সমস্ত স্কিমা জুড়ে করতে পারেন, তবে ডেটাবেস জুড়ে নয়। সেই কারণে, কোনও ডাটাবেস অন্য ডেটাবেস থেকে সম্পূর্ণরূপে নিরোধক হয় যখন একই ডাটাবেসের মধ্যে স্কিমার অন্যান্য স্কিমার থেকে অন্তরক হয় না।

যদি আপনার কোনও কারণে- ভবিষ্যতে স্কিমার জুড়ে ডেটা একত্রিত করতে হয় তবে একাধিক স্কিমার মাধ্যমে এটি করা সহজ হবে। একাধিক ডাটাবেসের সাথে আপনার একাধিক ডিবি-সংযোগের প্রয়োজন হবে এবং অ্যাপ্লিকেশন লজিক দ্বারা প্রতিটি ডাটাবেস থেকে "ম্যানুয়ালি" ডেটা সংগ্রহ এবং মার্জ করতে হবে।

পরে কিছু ক্ষেত্রে সুবিধাগুলি রয়েছে তবে প্রধান অংশের জন্য আমি মনে করি ওয়ান-ডাটাবেস-মাল্টিপল-স্কিমার পদ্ধতি আরও কার্যকর।


4

বেশ কয়েকটি ডাটাবেসের তুলনায় বেশ কয়েকটি স্কিমার হালকা ওজন হওয়া উচিত, যদিও আমি এটি উল্লেখ করে এমন একটি রেফারেন্স খুঁজে পাই না।

তবে আপনি যদি সত্যিই জিনিসগুলিকে খুব আলাদা রাখতে চান (ওয়েব অ্যাপ্লিকেশনটি রিফ্যাক্ট করার পরিবর্তে যাতে কোনও "গ্রাহক" কলামটি আপনার টেবিলগুলিতে যুক্ত হয়), আপনি এখনও পৃথক ডাটাবেস ব্যবহার করতে চাইতে পারেন: আমি দৃ as়ভাবে বলছি যে আপনি আরও সহজেই পুনরুদ্ধার করতে পারবেন কোনও নির্দিষ্ট গ্রাহকের ডাটাবেস - অন্য গ্রাহকদের বিরক্ত না করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.