কোড শাখাগুলির মধ্যে ভাগ করা ডাটাবেস স্কিমার সাথে কাজ করার কার্যকর উপায়গুলি কী কী?


12

একাধিক শাখা নিয়ে একটি প্রকল্পে কাজ করা, যেখানে প্রতিটি শাখা শেষ পর্যন্ত মূল শাখায় আবার একত্রিত হয় এবং নতুন বৈশিষ্ট্য বিকাশের জন্য সংক্ষেপে পৃথক করে দেওয়া হয়।

ডাটাবেস, যা এমএস এসকিউএল সার্ভার, একটি ভাগ করা স্কিমা রয়েছে, তবে প্রতিটি শাখা স্কিমায় অগ্রগতির সাথে সাথে পরিবর্তনগুলি করে।

আমার প্রাথমিক তদন্তটি হ'ল মূল শাখা থেকে ডেরিভেড শাখায় স্কিমা ভাগ করে নেওয়ার ভাল উপায়গুলি কী, যেমন মূল শাখায় করা পরিবর্তনগুলি সহজেই উদ্দীপ্ত শাখায় মার্জ করা হয়, উত্পন্ন নতুন পরিবর্তনের উপর পদক্ষেপ না নিয়েই easily শাখা?


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

2
আপনি কীভাবে স্কিমাটি সংস্করণ করছেন তার উপর এটি নির্ভরশীল। আপনি কি বেস অবজেক্টস প্লাস্টার পরিবর্তনের জন্য স্ক্রিপ্টস সংরক্ষণ করছেন? সংস্করণগুলির মধ্যে স্থানান্তরিত করতে পরিবর্তিত স্ক্রিপ্টগুলি তৈরি করতে আপনি কি স্কিমা তুলনা সরঞ্জামটি ব্যবহার করছেন? ভিএস 2010 ডাটাবেস প্রকল্প?
মার্ক স্টোর-স্মিথ

প্রাসঙ্গিক আলোচনা: dba.stackexchange.com/questions/2/…
নিক চামাস

1
এছাড়াও প্রাসঙ্গিক: martinfowler.com/articles/…
নিক চ্যামাস

উত্তর:


7

আমি ভার্সন নিয়ন্ত্রণ এবং আপনার ডেটাবেসগুলিতে বর্ণিতভাবে নিম্নলিখিত পদ্ধতিটি সফলভাবে ব্যবহার করেছি :

  • মেটাডাটাতে একটি সংস্করণ নম্বর বজায় রাখুন (আমি ডেটাবেস বর্ধিত সম্পত্তি ব্যবহার করি)
  • যে কোনও স্কিমা পরিবর্তন হ'ল একটি স্ক্রিপ্ট হিসাবে কোডেড যা বর্তমান সংস্করণ থেকে পরবর্তী সংস্করণে আপডেট হয়
  • সমস্ত স্ক্রিপ্ট সহ অ্যাপ্লিকেশন শিপগুলি সংস্করণ 0 (প্রাথমিক স্থাপনা) থেকে বর্তমান সংস্করণে সমস্তভাবে আপগ্রেড করতে
  • প্রতিটি পরিবর্তন একটি স্ক্রিপ্টের মাধ্যমে করা হয়। অভিধান এবং লুক টেবিল এন্ট্রিগুলির মতো 'সিস্টেম' ডেটা পরিবর্তন সহ।
  • যখন মোতায়েন করা হয়, অ্যাপ্লিকেশনটি অন ডিস্ক স্কিমা সংস্করণটি পরীক্ষা করে, তারপরে স্কিমাকে বর্তমানের প্রয়োজনীয় সংস্করণে আনতে সমস্ত আপগ্রেড পদক্ষেপগুলি চালায়

আমি প্রায়শই 'কীভাবে উত্স সংজ্ঞা স্ক্রিপ্টগুলিকে উত্স নিয়ন্ত্রণে রাখা থেকে এটি আলাদা? "এর মতামতটি শুনতে পাই। পার্থক্যটি বিশাল, কারণ আপনি যখন নিজের অ্যাপ্লিকেশনটির নতুন সংস্করণ স্থাপন করবেন আপনি কেবল একটি নতুন ডাটাবেস তৈরি করবেন না। বেশিরভাগ সময় আপনার অ্যাপ্লিকেশনটি বিদ্যমান ডেটা সহ বিদ্যমান ডাটাবেস আপগ্রেড করতে হবে । এটি একটি গুরুত্বপূর্ণ পার্থক্য, আপনার আপগ্রেড পদক্ষেপগুলি আপগ্রেড করার সময় বিদ্যমান ডেটার অখণ্ডতা এবং ধারাবাহিকতা নিশ্চিত করতে হবে। কিছু ক্রিয়াকলাপগুলি কোডে তুচ্ছ (টেবিল অবজেক্টের সংজ্ঞা স্ক্রিপ্টের ডিফল্ট মান সহ একটি অ-শর্তযুক্ত কলাম যুক্ত করুন), তবে প্রকৃত স্থাপনায় এগুলি সত্যই অত্যন্ত বেদনাদায়ক (সারণীতে 1.5 বিলিয়ন সারি রয়েছে, অ্যাড কলামটি শেষ হয়ে যাবে) লগ স্পেস যদি 'সিম্পলটন' উপায়ে সম্পন্ন হয়)।

এটি শাখাগুলি দিয়ে কীভাবে কাজ করে:

  • যখন শাখাটি তৈরি করা হয়, এটি বর্তমান স্কিমা সংস্করণটিকে স্ন্যাপ করে, সংস্করণটি 1.6 বলে
  • দলটি যখন শাখায় কাজ শুরু করে, এটি একটি নতুন সংস্করণ যুক্ত করে, 1.7 এবং তারপরে এটি 1.6 থেকে 1.7 পর্যন্ত আপগ্রেড পদক্ষেপের কোডিং শুরু করে
  • শাখায় পরিবর্তনগুলি করার সাথে সাথে আপগ্রেড পদক্ষেপটি পরিবর্তিত হবে। এটি সর্বদা স্ক্রিপ্টটি চালায় যা v 1.6 থেকে 1.7 থেকে আপগ্রেড হয় তবে ঠিক সেই স্ক্রিপ্টগুলি কী করে, শাখায় সাধারণ কোড পুনরাবৃত্তি এবং চেক-ইনগুলির সাপেক্ষে
  • শাখাটি উন্নয়ন শেষ করে, এটি বিপরীত সংহতকরণের জন্য প্রস্তুত করে (আবার বেসলাইনে একীভূত করতে)
    • এটি শাখাটিতে বেসলাইন থেকে নতুন ফরোয়ার্ড ইন্টিগ্রেশন করে। যদি ইন্টিগ্রেশনটি স্কিমা সংস্করণে কোনও পরিবর্তন না নিয়ে আসে, সমস্ত জিনিস ভাল হয়, শাখাটি যেমন হয় তেমন সংহতকে বিপরীত করতে পারে। সংস্করণ 1.7 নতুন বেসলাইন সংস্করণে পরিণত হয়।
    • আকর্ষণীয় জিনিস হ'ল যখন অন্য শাখাটি এর মধ্যে বেসে বিপরীত সংহত হয়ে গেছে এবং এখন বেস স্কিমা সংস্করণটি পরিবর্তিত হয়েছে, বলুন, 1.7। এক্ষেত্রে আমাদের শাখাটিকে তার স্থাপনার টার্গেট স্কিমা সংস্করণটি 1.8 এ ধাক্কা দিতে হবে এবং এটি নতুন পরিবেশে কীভাবে কাজ করে, কীভাবে 1.7 থেকে 1.8 আপগ্রেড করবে তা দেখতে আগে 1.6 থেকে 1.7 পর্যন্ত আপগ্রেড পদক্ষেপটি পর্যালোচনা করতে হবে। লজিক্যাল স্কিমা দ্বন্দ্বগুলি সমাধান করতে হবে, স্ক্রিপ্টে পরিবর্তনগুলি প্রয়োজন হতে পারে, পরীক্ষা করাতে হবে। একবার সম্পূর্ণ হয়ে গেলে, শাখাটি বেসে একীভূত করতে পারে। পণ্যটির মোতায়েন করা টার্গেট সংস্করণটি এখন 1.8 হয়ে যায়।
    • যখন অন্য একটি শাখা স্কিমা সংস্করণ ১.6 এ দাঁড় করিয়েছে, সেগুলি বিপরীত-সংহত করতে চায়, তখন এটির স্কিমা সংস্করণটি 1.9-তে বাম্প করতে হবে, 1.8 থেকে 1.9 পর্যন্ত আপগ্রেড স্ক্রিপ্টটি পরীক্ষা করতে হবে, তারপরে এটি বেসে সংহত করতে পারে।

লক্ষ্য করুন যে এতে কোনও সরঞ্জাম জড়িত নেই, কোনও ম্যাজিক স্কিমা ডিফ স্ক্রিপ্টিং নেই, উইজার্ড নেই এবং ডান-বোতাম-ক্লিক-জেনারেট-স্ক্রিপ্ট জড়িত নেই। এটি উত্স (স্ক্রিপ্ট) এর উপর ভিত্তি করে একটি 100% বিকাশকারী চালিত প্রক্রিয়া। অনেকে পুরো প্রক্রিয়াটি বিস্তৃত মনে করেন তবে এটি কার্যকর হয়। প্রকৃতপক্ষে, এসকিউএল সার্ভার ব্যবহারকারী হিসাবে, আপনি এসকিউএল সার্ভারের প্রতিদিনের ব্যবহারে এই প্রক্রিয়াটির ফলাফলগুলি ইতিমধ্যে ব্যবহার করেছেন: এসকিউএল সার্ভার নিজেই একটি খুব অনুরূপ ডাটাবেস আপগ্রেড প্রক্রিয়া ব্যবহার করে এবং যেমনটি আপনি সম্ভবত আশা করেন, পণ্য বিকাশ প্রক্রিয়াটি ব্যাপকভাবে ব্যবহার করে শাখা প্রশাখার সমস্যা এবং আপনি যে সমস্যাটি উল্লেখ করেছেন তা হ'ল একটি সত্যিকারের সমস্যা।

বিটিডাব্লু, কীভাবে শাখা / সংহতকরণ উত্স নিয়ন্ত্রণ পণ্যগুলির মধ্যে পৃথক ঘটে, আমি পারফর্মগুলির ইন্টিগ্রেটেড মোডের সাথে পরিচিত পদগুলি ব্যবহার করছি ।


+1, বিশেষত প্রতিটি পরিবর্তন একটি স্ক্রিপ্টের মাধ্যমে করা হয়
a_horse_with_no_name

1

যদিও আমার উত্তরটি রেমাসের মতো দীর্ঘ নয়, তবে আমি এটি সত্যিই ভাল সমাধান হিসাবে পেয়েছি। আমি এটি এখনও উত্পাদনে সেট আপ করতে পারি নি, তাই ওয়াইএমএমভি *।

Liquibase

মূলত এটি একটি এক্সএমএল ফাইল যেখানে আপনি এক্সএমএল ফাইলের অভ্যন্তরে নতুন উপাদান হিসাবে আপনার ডাটাবেজে স্কিমা পরিবর্তন করেন। উদাহরণ স্বরূপ:

<createTable tableName="department">
            <column name="id" type="int">
                <constraints primaryKey="true" nullable="false"/>
            </column>

এটিতে সম্পূর্ণরূপে মাংসলগ্ন বাক্য গঠন রয়েছে যাতে আপনি আপনার ডাটাবেসে যা কিছু করতে চান তা করতে পারেন।

আপনি আপনার লিকুইবেস ইনস্টলেশনটিতে নির্দিষ্ট করে দিতে পারেন যে আপনি কোন ডেটাবেসটির সংস্করণ তৈরি করতে চান। তারপরে আপনি অন্তর্ভুক্ত জাভা এক্সিকিউটেবল (জার ফাইল) সহ .xML "চালান"। এটি আপনার ডাটাবেসে এক্সএমএল-এ উল্লিখিত পরিবর্তনগুলি মূলত পুনরায় তৈরি করে।

আসল কিকারটি হ'ল আপনি এই এক্সএমএল ফাইলটিকে আপনার কোডের মতো একই সংস্করণযুক্ত ফোল্ডারে সঞ্চয় করেন। আমার উদাহরণস্বরূপ যে গিট ছিল। আমার প্রজেক্ট ফোল্ডারে এই এক্সএমএল ফাইলটি ছিল (/.git হিসাবে একই স্তরের) এবং তারপরে আমি যখনই শাখাগুলি স্যুইচ করেছিলাম তখন এক্সএমএল ফাইলটি সেই শাখার সংস্করণে পরিবর্তিত হবে এবং আমি .jar ফাইলটি চালাতাম এবং আমার ডাটাবেসটি এখন সেই শাখাকে প্রতিবিম্বিত করবে।

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


1

এখানে রেড গেটে আমরা শীঘ্রই একটি ডাটাবেস সংস্করণ সমাধান প্রকাশ করছি যা এসকিউএল তুলনা এবং এসকিউএল উত্স নিয়ন্ত্রণ উভয়কেই উপভোগ করে। এটি মাইগ্রেশন স্ক্রিপ্টগুলি আপগ্রেড পদ্ধতির ব্যবহার করে এবং কোনও উত্স নিয়ন্ত্রণ পুনর্বিবেচনার সাথে মিলিত সংস্করণ বর্ধিত বৈশিষ্ট্য সহ ডাটাবেসটিকে স্ট্যাম্প করে।

আমরা ডিসেম্বরের মাঝামাঝি সময়ে প্রকাশের আশা করছি। এখন একটি মুক্তির প্রার্থী উপলব্ধ। আরো তথ্যের জন্য, যান:

http://www.red-gate.com/products/sql-development/sql-source-control/entrypage/migration

আমরা আসন্ন মাসগুলিতে এই সমাধানটি তৈরি করার প্রত্যাশা করছি সুতরাং আপনারা কী মনে করেন দয়া করে আমাদের তা জানান।


0

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


আসলেই না। বেস অবজেক্ট তৈরি স্ক্রিপ্টগুলির ম্যানুয়াল একীকরণ কার্যকর হয় তবে পরিবর্তন, রেফারেন্স ডেটা সন্নিবেশ এবং ডেটা মোশন স্ক্রিপ্টগুলি খুব অগোছালো হয়ে যায়, খুব দ্রুত।
মার্ক স্টোর-স্মিথ 21

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

0

আমি একই পরিস্থিতিতে রয়েছি যেখানে আমি একটি লাইভ ওয়েবসাইট এবং বেশ কয়েকটি উন্নয়ন শাখায় কাজ করি যেখানে আমার ডাটাবেস স্কিমা পরিবর্তন করতে হবে।

আমি পোস্ট-চেকআউট এবং গিটারের সাথে সুন্দরভাবে ব্যবহার করা যেতে পারে এমন একটি পোস্ট-মার্জ হুক লিখে এটি সমাধান করেছি। আমি আমার সমস্ত মাইগ্রেশনগুলি এসকিউএল ফাইল আকারে একটি পৃথক ডিরেক্টরিতে সঞ্চয় করি এবং পরিবর্তিত পিএইচপি কোডের পাশাপাশি তাদের প্রতিশ্রুতিবদ্ধ। প্রতিবার আমি পারফর্ম করি ক

git checkout

বা ক

git merge

গিটটি স্বয়ংক্রিয়ভাবে উপযুক্ত আপ এবং ডাউন-মাইগ্রেশনকে কল করবে। গিথুবে আমার বাস্তবায়ন দেখুন ।

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