স্কালার মতো ক্রিয়ামূলক ভাষায় আমার কেন একটি ওআরএমের প্রয়োজন হবে না?


30

আমি ভাবছি যে আমি প্যাটার্ন ম্যাচিং, অপশন এবং এটি সাধারণভাবে আমার কাছে ক্লিনার সিনট্যাক্সের মতো কিছু স্কেলার বৈশিষ্ট্যের সুবিধা নিতে একটি স্প্রিং + হাইবারনেট প্রকল্পে জাভা থেকে স্কালায় যেতে পারি কিনা। আমি স্কালা বাস্তুসংস্থায় ডিআরএফ দ্বারা ORM সন্ধান করেছি এবং আমি অ্যাক্টিভেটের মতো চিন্তাভাবনা খুঁজে পেয়েছি (তবে বেশিরভাগ ক্ষেত্রে আমি হায়ারনেট স্কালার সাথে ব্যবহার করতে পারি কিনা তা খুঁজে বের করার চেষ্টা করি)। এটি অনুসন্ধান করে আমি জেপিএ + স্কালার সম্পর্কে প্লে ডকুমেন্টেশনে এটি পড়েছি ।

তবে সবচেয়ে গুরুত্বপূর্ণ বিষয়টি হ'ল: যখন আপনার কার্যকরী ভাষার ক্ষমতা থাকে তখন আপনার কি সত্যই অবজেক্টস ম্যাপারের সাথে সম্পর্কিত হতে হবে? সম্ভবত না. JPA হ'ল জাভাটির ডেটা ট্রান্সফারেশনে ক্ষমতার অভাব বিমোচন করার একটি সুবিধাজনক উপায়, তবে আপনি যখন স্কালা থেকে এটি ব্যবহার শুরু করেন তখন সত্যিই ভুল মনে হয়।

একটি সম্পূর্ণ অ্যাপ্লিকেশন তৈরি করতে ফাংশনাল প্রোগ্রামিং কীভাবে ব্যবহার করতে হয় সে সম্পর্কে আমার গভীর ধারণা নেই (এজন্যই আমি স্কালা ব্যবহার করার ইচ্ছা নিয়েছি যাতে এটি আরও ক্রমান্বয়ে বুঝতে পারি, যেহেতু এটি ওও + ফাংশনালের সাথে সম্মিলিত হয়), তাই আমি বুঝতে পারি না আমার কেন ক্রিয়ামূলক ভাষার সাথে একটি ওআরএমের প্রয়োজন হবে না এবং ডোমেন মডেলটির দৃ pers়তা মোকাবেলায় কার্যকরী পদ্ধতির কী হবে।

ব্যবসায়ের যুক্তির জন্য একটি ডিডিডি পন্থা স্ক্যালার সাথে এখনও উপলব্ধি করে, তাই না?


3
এটি একটি মতামত ভিত্তিক প্রশ্ন। স্কেলা নিখুঁতভাবে কার্যকরী নয়, এটি একটি ওও ভাষাও তাই এটি ব্যাখ্যা করবে যে আপনি এখনও কেন একটি ORM সরঞ্জাম ব্যবহার করতে চান। ডিবি ম্যাপিং জন্য, উদাহরণস্বরূপ দেখুন: বাক্পটুতাপূর্ণ , SORM , Anorm
জেস্পার

আমি কোন মতামত খুঁজছি না, আমি দৃistence়তা অর্জনের উপায় কী তা কার্যকরী দৃষ্টান্তের গভীর বোঝার সাথে কিছু জিজ্ঞাসা করছি। আমি জানি যে স্কালা একটি সংকর এবং আমি এর ওও অংশটি ডিডিডি-র জন্য ব্যবহার করতে চাই। সুতরাং আপনি বলছেন যে আমি যদি স্কালার সাথেও ডিডিডি পন্থা গ্রহণ করি তবে একটি ওআরএম যাওয়ার উপায় কী?
গ্যাব্রিয়েলজিউসি

কার্যকরী ভাষাগুলিতে আপনি মূলত এমন মানগুলি নিয়ে কাজ করেন যা বস্তুর মতো পরিচয় রাখে না। অতএব আপনার চেঞ্জ-ট্র্যাকিংয়ের দরকার নেই যা কোনও ওআরএম এর অন্যতম প্রধান কাজ is
লি


5
আপনি না প্রয়োজন একটি ORM কোনো প্রধান ভাষা।
গ্র্যান্ডমাস্টারবি

উত্তর:


30

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

কোনও ওআরএম প্রয়োজন নেই

SQLAlchemy দুটি স্বতন্ত্র উপাদান, হিসাবে পরিচিত নিয়ে গঠিত কোর এবং ORM । কোর নিজেই একটি সম্পূর্ণ বৈশিষ্ট্যযুক্ত এসকিউএল অ্যাবস্ট্রাকশন টুলকিট, বিবিধ বিভিন্ন DBAPI বাস্তবায়ন এবং আচরণের উপর বিমূর্ততার একটি মসৃণ স্তর সরবরাহ করে, পাশাপাশি একটি এসকিউএল এক্সপ্রেশন ল্যাঙ্গুয়েজ যা জেনারেটর পাইথন এক্সপ্রেশনগুলির মাধ্যমে এসকিউএল ভাষার প্রকাশের অনুমতি দেয়। একটি স্কিমা প্রতিনিধিত্বমূলক সিস্টেম যা উভয়ই ডিডিএল বিবৃতি নির্গত করতে পারে এবং বিদ্যমান স্কিমাগুলি আত্মমোচন করতে পারে এবং একটি টাইপ সিস্টেম যা পাইথন প্রকারের কোনও ম্যাপিংকে ডাটাবেস প্রকারগুলিতে মঞ্জুরি দেয়, সিস্টেমকে ঘিরে ফেলে। অবজেক্ট রিলেশনাল ম্যাপারটি হ'ল একটি .চ্ছিক প্যাকেজ যা কোরকে কেন্দ্র করে।

প্রথম পৃষ্ঠাটি ORM এর বর্ণনা দেয়:

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

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

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

// Typesafely execute the SQL statement directly with jOOQ
Result<Record3<String, String, String>> result =
    create.select(BOOK.TITLE, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
          .from(BOOK)
          .join(AUTHOR)
          .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
          .where(BOOK.PUBLISHED_IN.equal(1948))
          .fetch();

এখন, প্লে ফ্রেমওয়ার্কটি আমি যা যা বর্ণনা করেছি তাতে লিগে 100% বলে মনে হচ্ছে না , তবে তাদের যুক্তিটি এই সাধারণ জায়গাতেই রয়েছে বলে মনে হচ্ছে: এটি ক্লাসে অনুবাদ করার পরিবর্তে সরাসরি সম্পর্কিত মডেলটির সাথে কাজ করুন এবং সেগুলি থেকে ফিরে আসুন।

JOOQ গ্রন্থাগার ORMs করার জন্য একটি সুরের যেমন অধ্যয়নরত মূল্য। তাদের কিছু প্রাসঙ্গিক ব্লগ এন্ট্রি রয়েছে যা পড়ার মতো:


19

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

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

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


1
+1000 যাঁরা স্ক্যালাকে ব্যবহার করার জন্য জেফার মতো জোর দিয়েছিলেন তারা ভাষা ভবিষ্যতের জন্য আমাকে ভয় পান :(
অ্যান্ড্রেস এফ।

9

স্কেলে এটি ডাটাবেস টেবিলগুলিকে অবজেক্টগুলিতে মানচিত্র করা এখনও কার্যকর এবং এটি করার বিভিন্ন উপায় রয়েছে।

স্কালালির বিশ্বে একটি জনপ্রিয় কাঠামো হতাশ । এটি কোনও ওআরএম নয়, কারণ এটি কম করে (যেমন এটি স্পষ্টভাবে যোগদানের কথা বলা ছাড়া সম্পর্ক আনতে পারে না)।

সুতরাং আপনি এখনও ডাটাবেস সারিগুলিতে অবজেক্টগুলিকে ম্যাপ করেন, তবে আপনার অবজেক্টগুলি অপরিবর্তনীয়, (সুতরাং কোনও রাজ্য-ফ্লাশিং নয়) এবং আপনি স্পষ্টতই একটি monadic DSL ব্যবহার করে অনুসন্ধানগুলি সম্পাদন করেন। ফলাফলটি হ'ল পরিবর্তনের আশেপাশের সমস্যাগুলি এবং অনাকাঙ্ক্ষিত এন + 1 সমস্যা ছাড়াই আপনি একটি ওআরএমের "ভাল" অংশগুলি পেয়ে যান।

একটি লক্ষ্য করা উচিত যে লোকেরা অ্যানোরমের মতো অনেক বেশি পাতলা লাইব্রেরি ব্যবহার করে দুর্দান্ত সাফল্য অর্জন করেছে সুন্দর রাখতে কার্যকরী কৌশলগুলি ব্যবহার বা স্ট্রেইট জেডিবিসি ।

জেডিবিসির শীর্ষে কার্যকরী কৌশল প্রয়োগ করে এমন একটি দুর্দান্ত গ্রন্থাগারটিও ডুবি

সুতরাং আপনার কাছে ডাটাবেস অ্যাক্সেসের জন্য অনেক পছন্দ আছে তবে হাইবারনেট (যা ডি-ফ্যাক্টো ওআরএম বলে মনে হচ্ছে) সেরাগুলির মধ্যে একটি নয়, পরিবর্তনের দিকে পক্ষপাতদুষ্ট হওয়ার কারণে।


0

এমনকি অবজেক্ট-ওরিয়েন্টেড ভাষায় আপনার কোনও ওআরএম দরকার নেই।

প্রথমত, কে বলেছিল যে আপনার অজানা স্টোরেজ থেকে আপনার অবজেক্টে ডেটা শারীরিকভাবে অনুলিপি করা উচিত? স্মলটকের পিছনে থাকা অ্যালান কে , জিনিসগুলি ডেটা থেকে মুক্তি পেতে চেয়েছিলেন । তিনি পরামর্শ দিয়েছিলেন যে কোনও বস্তুর কেবল এমন কোনও অঞ্চলের রেফারেন্স থাকতে পারে যেখানে এর ডেটা সঞ্চিত থাকে।

দ্বিতীয় - এটি অর্জনের সেরা উপায় কী? আমি আপনার জিনিসগুলি তাদের দায়িত্বগুলির দ্বারা সনাক্ত করার এবং তাদের কাছে থাকা ডেটা সম্পর্কে চিন্তা না করার পরামর্শ দিচ্ছি । যদি আপনি সিআরসি কার্ডগুলির পদ্ধতির কথা শুনে থাকেন তবে এটি ঠিক তার জন্য ব্যবহৃত হয়েছে।

এবং, শেষ অবধি, আপনি যদি কখনও ওও-ফিল্ডে ফিরে আসেন তবে এটিকে বাস্তবায়নের জন্য এখানে একটি উপায়

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