এনএইচবারনেট বনাম LINQ থেকে এসকিউএল


117

এমন কেউ হিসাবে যিনি রিয়েল-ওয়ার্ল্ড প্রকল্পগুলিতে কোনও প্রযুক্তিই ব্যবহার করেননি আমি ভাবছি যে কেউ যদি জানেন যে এই দুটি কীভাবে একে অপরের পরিপূরক হয় এবং তাদের কার্যকারিতা কতটা ওভারল্যাপ করে?

উত্তর:


113

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

টেবিল-প্রতি-শ্রেণীর প্যাটার্নের সমস্যাটি হ'ল আপনার ডোমেন ডিজাইনটির উপরে আপনার ডাটাবেস কাঠামোর প্রত্যক্ষ প্রভাব রয়েছে। উদাহরণস্বরূপ, আসুন আমরা গ্রাহকের প্রাথমিক ঠিকানার তথ্য ধরে রাখতে নিম্নলিখিত কলামগুলির সাথে গ্রাহক টেবিল রয়েছে:

  • রাস্তার ঠিকানা
  • শহর
  • রাষ্ট্র
  • ফ্যাস্ শব্দ

এখন, ধরা যাক আপনি গ্রাহকের মেইলিং ঠিকানার জন্য কলামগুলিও যুক্ত করতে চান যাতে আপনি গ্রাহকদের টেবিলে নিম্নলিখিত কলামগুলিতে যুক্ত করতে পারেন:

  • MailingStreetAddress
  • MailingCity
  • MailingState
  • MailingZip

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

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

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


4
আপনি লিনাক টু এসকিউএল ব্যবহার করে আপনার সংগ্রহস্থলটিকে কোড করতে পারেন, এটি খুব সহজ।
নিকোলাস ডরিয়ার 15

1
আমি মনে করি এটি অ্যাক্টিভেকর্ড নয়, এমনকি ম্যাপ করা ক্লাসগুলি কিছু কিছু অবকাঠামোগত যুক্তি সজ্জিত করে। অ্যাক্টিভেকর্ড প্যাটার্নটি হ'ল যদি আপনার গ্রাহকসেভ () থাকতে পারে। এল 2 এস, হাইবারনেট সেশনের মতো ডেটা কনটেক্সট ক্লাসের সাথে ইউনিট অব ওয়ার্ক প্যাটার্ন প্রয়োগ করে, তবে এনএইচ-এর আসল পোকো পন্থা রয়েছে।
হ্রভোজে হুডো

1
@ কেভিন "লিনকিউ থেকে এসকিউএল সক্রিয় রেকর্ড প্যাটার্ন ব্যবহার করে" এটি সঠিক নয়। এটি বলার মতো যে ADO.NET সক্রিয় রেকর্ড ব্যবহার করে বা এনএইচবারনেট সক্রিয় রেকর্ড ব্যবহার করে। এগুলি সমস্ত ডেটা অ্যাক্সেস প্রযুক্তি এবং কোনও নির্দিষ্ট ডেটা অ্যাক্সেস প্যাটার্ন প্রয়োগ করে না। আমি ব্যক্তিগতভাবে সংগ্রহস্থল প্যাটার্ন সহ লিনাক-টু-এসকিএল ব্যবহার করতে পছন্দ করি। আপনি ঠিক বলেছেন যে লিনাক-টু-স্কেল এনএইচবারনেটের মতো জটিল ম্যাপিংগুলিকে সমর্থন করে না।
liammclennan

1
পরিবর্তে আপনার ডাটাবেসকে সাধারন করা, এবং আপনার ডালকে এসকিউএলমেটাল দ্বারা সরঞ্জাম উত্পন্ন হতে দেওয়া?
অ্যালেক্স

3
@ কফিএডিক্টিক্ট যখন ইমিডেন্সের অমিলটি বহন করার পক্ষে খুব বেশি, তখনই যখন আপনার অ্যাপ্লিকেশনটি লিনকিউ এস এসকিউএল-এ ব্যবহার করতে খুব জটিল হয় তবে ইমো। আমার উদাহরণটি দুর্গন্ধযুক্ত কারণ হ'ল লিনকিউ এসকিউএল-এর সাথে ব্যবহারের ফলে 2 টির বিপরীতে 8 টি বৈশিষ্ট্য তৈরি হবে এবং অ্যাড্রেস ক্লাসে কার্যকর ফাংশনগুলি প্রয়োগ করা বা অ্যাড্রেস ক্লাসে রুটিনগুলি প্রয়োগ করা যেমন আপনি করতে সক্ষম হবেন এমন কিছু করার আপনার ক্ষমতা সীমাবদ্ধ করে আপনি যদি NHibernate ব্যবহার করে থাকেন।
কেভিন প্যাং

26

দুটি পয়েন্ট যা এখনও মিস করা হয়েছে:

এছাড়াও নাইবারনেট- এর নতুন সাবলীল ইন্টারফেসটি নীবারনেটের ম্যাপিংটি কনফিগার করতে কম বেদনাদায়ক বলে মনে হচ্ছে। (নীবারনেটের একটি ব্যথার পয়েন্ট মুছে ফেলা)


হালনাগাদ

Linq Nhiberate করার Nhiberate v3 এর মধ্যে যে এখন উত্তম আলফা । দেখে মনে হচ্ছে এই বছরের শেষের দিকে নিহাইরেট ভি 3 চালিয়ে যেতে পারে।

সত্তা ফ্রেম ওয়ার্ক .net 4 যেমন একটি বাস্তব বিকল্প মত চেহারা শুরু হয়।


2
লিনাক থেকে এনএইচবারনেট এখনও খুব প্রাথমিক পর্যায়ে রয়েছে। এটি সম্পূর্ণ বাস্তবায়ন নয় এবং তর্কসাপেক্ষভাবে, উত্পাদন ব্যবহারের জন্য মোটেই প্রস্তুত নয়।
liammclennan

নতুন লিনকোনেট ২.০ রিলিজে সুবিধার জন্য কিছু অতিরিক্ত বৈশিষ্ট্য উপস্থাপন করা হয়েছে, যেমন টেবিল প্রতি প্রকার উত্তরাধিকার সমর্থন, পলিংকিউ সমর্থন এবং ব্যাচ আপডেটগুলি কার্যকারিতা। ওআরএম ডিজাইনার (ডিভার্ট সত্তা বিকাশকারী) এর এখন মডেল ফার্স্ট সমর্থন এবং ম্যাপিং সিঙ্ক্রোনাইজেশন বৈশিষ্ট্য রয়েছে। আরও বিশদ: devart.com/news/2010/dotconnects600.html
ডিভার্ট

23

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

আমি মনে করি না আপনি বলতে পারেন যে লিনক এবং এনহাইবারনেট একে অপরের পরিপূরক হিসাবে এটি বোঝায় যে এগুলি একসাথে ব্যবহার করা যেতে পারে, এবং এটি সম্ভব হলেও আপনি একটিটিকে বেছে নেওয়া এবং এটির সাথে আঁকড়ে থাকাই আরও ভাল।

এনএইচবারনেট আপনাকে আপনার ডোমেনের টেবিলগুলিকে আপনার ডোমেন অবজেক্টগুলিতে অত্যন্ত নমনীয় উপায়ে মানচিত্র করতে দেয়। এটি আপনাকে ডাটাবেসটি জিজ্ঞাসা করতে এইচবিএল ব্যবহার করার অনুমতি দেয়।

লিঙ্ক টু এসকিউএল আপনাকে ডাটাবেসে আপনার ডোমেন অবজেক্টগুলি ম্যাপ করার অনুমতি দেয় তবে এটি ডাটাবেস অনুসন্ধানের জন্য লিনক ক্যোয়ারী বাক্য গঠনটি ব্যবহার করে

এখানে মূল পার্থক্য হ'ল লিংক ক্যোয়ারী বাক্য গঠনটি আপনার প্রশ্নগুলি বৈধ কিনা তা নিশ্চিত করতে সংকলক দ্বারা সংকলন সময়ে পরীক্ষা করা হয়।

লিনাকের সাথে সচেতন হওয়ার মতো কিছু বিষয় হ'ল এটি কেবল। নেট 3.x এ উপলব্ধ এবং কেবল ভিএস2008 এ সমর্থিত। এনএইচবারনেট 2.0 এবং 3.x পাশাপাশি ভিএস2005 এ উপলব্ধ।

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


15
আপনি যদি কোনও লিগ্যাসি ডাটাবেস কাঠামোর বিরুদ্ধে কোড লিখছেন যা আপনি পরিবর্তন করতে পারবেন না কারণ এটি অন্যান্য অ্যাপ্লিকেশনগুলিকে সমর্থন করে। আপনি কি চান যে আপনার ডোমেন মডেলটি খারাপ ডাটাবেস ডিজাইনের উত্তরাধিকারী হোক বা আপনি একটি সমৃদ্ধ ডোমেন মডেল তৈরি করতে চান যা ডাটাবেস কাঠামোর চেয়ে স্বতন্ত্রভাবে পরিবর্তিত হতে পারে?
ল্যারি ফৌলক্রড

7

সাবলীল এনএইচবারনেট সহজ কনভেনশনগুলির উপর ভিত্তি করে আপনার ম্যাপিং ফাইলগুলি তৈরি করতে পারে। কোনও এক্সএমএল-লিখন এবং দৃ strongly়ভাবে টাইপ করা হয়নি।

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

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

আমি এল 2 এস থেকে যে জিনিসটি মিস করব তা হ'ল বেশিরভাগ কোড জেনারেশন যা সত্তার উভয় প্রান্তে সম্পর্ককে আপ টু ডেট রাখে। তবে আমার ধারণা এনহাইবারনেটকেও সেখানে করার জন্য কিছু সরঞ্জাম রয়েছে ...


2
যদি অন্যদের মধ্যে আপনার পোস্ট পড়া এবং জাম্পিং জাহাজ খুব চিন্তা হয় - .ObjectTrackingEnabled = falseআপনার উপর DataContextআপনার পরিবর্তন ট্র্যাকিং সমস্যা সমাধান হবে। যতক্ষণ আপনি ইউনিট-অফ ওয়ার্ক প্যাটার্নে কেনেন এবং ডিডিডি করার চেষ্টা করছেন না ততক্ষণ লিনক-টু-এসকিউএল সত্যিই বিতরণ করে।
mattmc3

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

5

আপনি কি "লিনকিউ" বলতে চাইছেন তা কি স্পষ্ট করে বলতে পারেন?

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

অনেকে লিনকউ থেকে এসকিউএলকে লিনকুই হিসাবে উল্লেখ করেন তবে এটি মোটেই সঠিক নয়। মাইক্রোসফ্ট .NET 3.5 এসপি 1 দিয়ে লিনক টু সত্তা সবেমাত্র প্রকাশ করেছে। অতিরিক্তভাবে, এনহাইবারনেটটির একটি লিনকিউ ইন্টারফেস রয়েছে, সুতরাং আপনি আপনার ডেটা পেতে লিনকিউ এবং এনহাইবারনেট ব্যবহার করতে পারেন।


2

লিনকিউ দ্বারা, আমি ধরে নিচ্ছি যে আপনি লিনকিউকে এসকিউএল বলে বোঝাচ্ছেন কারণ লিনকুই এর সাথে কোনও ডেটাবেস "চলমান" নেই। এটি কেবল একটি ক্যোয়ারী ভাষা যা এসকিউএল-ইশ দেখতে এটির জন্য সিনট্যাক চিনির একটি নৌকা-বোঝা রয়েছে।

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


1

প্রথমে দুটি আলাদা জিনিস আলাদা করা যাক: ডাটাবেস মডেলিং ডেটা সম্পর্কে উদ্বিগ্ন এবং অবজেক্ট মডেলিং সত্তা এবং সম্পর্কের বিষয়ে উদ্বিগ্ন।

লিনাক-টু-এসকিউএল সুবিধা হ'ল ডেটাবেস স্কিমার বাইরে ক্লাস তৈরি করা যাতে তারা সক্রিয় রেকর্ড অবজেক্ট হিসাবে ব্যবহার করতে পারে (সক্রিয় রেকর্ড ডিজাইনের নকশা সংজ্ঞাটি দেখুন)।

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

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

গ্রিনফিল্ড প্রকল্পগুলিতে যেখানে ডাটাবেসের ভাল নামকরণ এবং কম জটিলতা রয়েছে, লিনক-টু-এসকিউএল ভাল পছন্দ হতে পারে।

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

অন্যদিকে লিনাক-টু-এসকিউএল শেখার বক্ররেখা NHibernate এর চেয়ে ছোট smaller


0

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


0

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

MyDataContext db = new MyDataContext();
List<CUSTOMER_ORDER_LINEITEMResult> records = db.CUSTOMER_ORDER_LINEITEM(pram1, param2 ...).ToList<CUSTOMER_ORDER_LINEITEMResult>();

আপনি ফোরচ লুপে রেকর্ড অবজেক্টটিও ব্যবহার করতে পারেন, যা এনএইচবারনেট দ্বারা সমর্থিত নয়

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