সদস্য: ডোমেন অবজেক্ট বনাম অনন্য আইডি ব্যবহার করুন


10

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

User( id: Int, CurrentlyReadingBooksId: List[Int])
Book( id: Int, LoanedToId: Int )

বা (2), (1) এর পরে অগ্রাধিকার দেওয়া: আমাদের কি প্রতিটি কিছুর জন্য প্রকারগুলি সংজ্ঞায়িত করা উচিত?

User( id: UserId, CurrentlyReadingBooksId: List[ BookId] )
Book( id: BookId, LoanedToId: UserId )

বা (3)

User( id: Int, CurrentlyReadingBooks: List[Book]) 
Book( id: Int, LoanedTo: User)

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

এখনও অবধি কিছু উত্তরের উপর ভিত্তি করে, আমার প্রশ্নটির পুনরাবিশ্বেচনা: (মোড়িত ধরণের আইডির ব্যবহার সহ) 1) সর্বদা আইডি ব্যবহার করবেন? 2) সবসময় অবজেক্টস ব্যবহার করবেন? ৩) সিরিয়ালাইজেশন এবং ডিসরিয়ালাইজিংয়ে পুনরাবৃত্তি হওয়ার ঝুঁকি থাকলে আইডি ব্যবহার করুন, তবে অন্যথায় অবজেক্ট ব্যবহার করবেন? ৪) আর কিছু?

সম্পাদনা: আপনি যদি উত্তর দেন যে অবজেক্টগুলি সর্বদা বা কিছু ক্ষেত্রে ব্যবহার করা উচিত, দয়া করে অন্যান্য উত্তরদাতারা পোস্ট করেছেন সবচেয়ে বড় উদ্বেগের উত্তরটি নিশ্চিত করে নিশ্চিত করুন => কীভাবে ডিবি থেকে ডেটা পাবেন?


1
ভাল প্রশ্নের জন্য ধন্যবাদ, আগ্রহ সহ এটি অনুসরণ করতে প্রত্যাশিত। কিছুটা লজ্জার বিষয় যে আপনার ব্যবহারকারীর নামটি "ইউজার 18151", এই ধরণের ব্যবহারকারীর নাম সহ লোকেরা কিছু উপেক্ষা করবে :)
বিজেফ্লেচার

@ বিজেফ্লেচার আপনাকে ধন্যবাদ আমি নিজেই এই টানটান ধারণাটি পেয়েছি, তবে কেন তা আমার কাছে ঘটেনি!
0fnt

উত্তর:


7

আইডিস হিসাবে ডোমেন অবজেক্টগুলি কিছু জটিল / সূক্ষ্ম সমস্যা তৈরি করে:

ধারাবাহিকতাতে / Deserialization

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

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

সূক্ষ্ম রেফারেন্স ফাঁস:

আপনি যেমন কন্সট্রাক্টরগুলিতে ডোমেন অবজেক্ট ব্যবহার করেন আপনি এমন বিজ্ঞপ্তি রেফারেন্স তৈরি করবেন যা অবজেক্টগুলি সক্রিয়ভাবে ব্যবহার না করার জন্য মেমরিটিকে পুনরায় দাবি করতে দেওয়া খুব কঠিন হবে।

আদর্শ পরিস্থিতি:

ওপাক আইডস বনাম ইন / দীর্ঘ:

একটি idএকটি সম্পূর্ণ অস্বচ্ছ আইডেন্টিফায়ার এটি কি চিহ্নিত সম্পর্কে কোন তথ্য বহন করে হওয়া উচিত। তবে এটির কিছুটা যাচাইয়ের প্রস্তাব দেওয়া উচিত যে এটি এর সিস্টেমে একটি বৈধ শনাক্তকারী।

কাঁচা ধরণেরগুলি এটি ভেঙে দেয়:

int, longএবং Stringআরডিবিএমএস সিস্টেমে সনাক্তকারীদের জন্য সর্বাধিক ব্যবহৃত কাঁচা প্রকার। বাস্তব কারণগুলির দীর্ঘ ইতিহাস রয়েছে যা কয়েক দশক আগের এবং সেগুলি সমস্ত আপস যা সংরক্ষণ spaceবা সঞ্চয় timeবা উভয় ক্ষেত্রেই উপযুক্ত।

সিক্যুয়াল আইডগুলি হ'ল সবচেয়ে খারাপ অপরাধী:

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

String ক্ষেত্রগুলি সমস্যাযুক্ত কারণ নিষ্পাপ ডিজাইনারগণ বিষয়বস্তুগুলিতে তথ্য সাধারণত প্যাক করবে, সাধারণত অস্থায়ী শব্দার্থবিদ্যাও।

এগুলি বিতরণকারী ডেটা সিস্টেম তৈরি করাও অসম্ভব, কারণ বিশ্বব্যাপী 12437379123এটি অনন্য নয় । যখন আপনি কোনও সিস্টেমে পর্যাপ্ত পরিমাণ ডেটা পাবেন তখন কোনও বিতরণকারী সিস্টেমে অন্য নোড একই নম্বর সহ একটি রেকর্ড তৈরি করার সম্ভাবনা বেশ গ্যারান্টিযুক্ত।

তারপরে হ্যাকগুলি এর চারপাশে কাজ শুরু করে এবং পুরো জিনিসটি বাষ্পীয় জঞ্জালের গাদা হয়ে যায়।

বিশাল বিতরণকারী সিস্টেমগুলি ( ক্লাস্টারগুলি ) উপেক্ষা করে আপনি অন্যান্য সিস্টেমের সাথেও ডেটা ভাগ করার চেষ্টা শুরু করলে এটি একটি সম্পূর্ণ দুঃস্বপ্ন হয়ে যায়। বিশেষত যখন অন্য সিস্টেম আপনার নিয়ন্ত্রণে থাকে না।

আপনার আইডিটিকে কীভাবে বিশ্বব্যাপী অনন্য করা যায়, ঠিক একই সমস্যাটি শেষ করবেন।

ইউইউডিটি একটি কারণে তৈরি এবং মানক করা হয়েছিল:

UUIDVersionআপনি যেটি ব্যবহার করেন তার উপর নির্ভর করে উপরে তালিকাভুক্ত সমস্ত সমস্যা থেকে ভুগতে পারেন।

Version 1একটি অনন্য আইডি তৈরি করতে একটি ম্যাক ঠিকানা এবং সময় ব্যবহার করে। এটি খারাপ কারণ এটিতে অবস্থান এবং সময় সম্পর্কে অর্থপূর্ণ তথ্য বহন করে। এটি নিজেই কোনও সমস্যা নয়, যখন নিষ্পাপ বিকাশকারীরা ব্যবসায়িক যুক্তির জন্য সেই তথ্যের উপর নির্ভর করতে শুরু করেন। এটি এমন কোনও তথ্যও ফাঁস করে যা কোনও অনুপ্রবেশ প্রচেষ্টাতে ব্যবহার করা যেতে পারে।

Version 2কোনও ব্যবহারকারী UIDবা GIDডোমিয়ান ব্যবহার করে UIDবা GUIএর থেকে সময়ের পরিবর্তে ডেটা ফাঁস এবং এই তথ্যটিকে ব্যবসায়ের যুক্তি হিসাবে ব্যবহার করার জন্য ঝুঁকিপূর্ণ Version 1করার মতোই খারাপ Version 1

Version 3অনুরূপ তবে ম্যাকের ঠিকানা এবং সময়কে এমন কিছু থেকে MD5কিছু অ্যারের একটি হ্যাশ দিয়ে প্রতিস্থাপন করে byte[]যার অবশ্যই শব্দার্থক অর্থ রয়েছে। চিন্তার জন্য কোনও তথ্য ফাঁস নেই, এটির byte[]কাছ থেকে পুনরুদ্ধার করা যায় না UUID। এটি আপনাকে নির্বিচারে UUIDউদাহরণস্বরূপ ফর্ম এবং কোনও ধরণের বাহ্যিক কী তৈরির জন্য একটি ভাল উপায় দেয় ।

Version 4 এটি কেবল এলোমেলো সংখ্যার উপর ভিত্তি করে যা একটি ভাল সমাধান, এটি একেবারে কোনও অর্থ সংক্রান্ত তথ্য বহন করে না, তবে এটি নির্বিচারে পুনরায় সৃজনশীল নয়।

Version 5ঠিক মত Version 4তবে sha1পরিবর্তে ব্যবহার করে md5

ডোমেন কী এবং লেনদেনের ডেটা কীগুলি

ডোমেন অবজেক্ট আইডির জন্য আমার পছন্দটি হ'ল ব্যবহার করা Version 5বা কোনও প্রযুক্তিগত কারণে Version 3ব্যবহার থেকে বিরত থাকলে Version 5

Version 3 লেনদেনের ডেটার জন্য দুর্দান্ত যা অনেকগুলি মেশিনে ছড়িয়ে পড়ে।

আপনি যদি স্থান দ্বারা সীমাবদ্ধ না হন তবে কোনও ইউইউডি ব্যবহার করুন:

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

Version 3,4,5 সম্পূর্ণরূপে অস্বচ্ছ এবং এটি তাদের হওয়া উচিত।

আপনার কাছে প্রাথমিক কী হিসাবে একটি একক কলাম থাকতে পারে UUIDএবং তারপরে প্রাকৃতিক যৌগিক প্রাথমিক কী কী হত তার জন্য আপনার কাছে যৌগিক অনন্য সূচি থাকতে পারে।

সংগ্রহস্থল নেই না হতে হবে CHAR(36)পারেন। আপনি UUIDপ্রদত্ত ডেটাবেসের জন্য দেশীয় বাইট / বিট / সংখ্যা ক্ষেত্রে সংরক্ষণ করতে পারেন যতক্ষণ না এটি সূচকযোগ্য।

উত্তরাধিকার

আপনার যদি কাঁচা ধরণের থাকে এবং সেগুলি পরিবর্তন করতে না পারেন তবে আপনি এগুলি এখনও আপনার কোডে বিমূর্ত করতে পারেন।

একটি ব্যবহার Version 3/5এর UUIDজন্য আপনি পাস করতে পারেন Class.getName()+ + String.valueOf(int)হিসেবে byte[]এবং একটি অস্বচ্ছ রেফারেন্স কী recreatable এবং নির্ণায়ক আছে।


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

আমি একটি স্পষ্ট ব্যাখ্যা যুক্ত করেছি।

এখন বুঝতে পেরেছি. উত্তরে সময় ব্যয় করার জন্য ধন্যবাদ।
0fnt

1
বিটিডব্লিউ, এএফআইএকের প্রজন্মের আবর্জনা সংগ্রহকারীদের (যা আমি বিশ্বাস করি যে এই দিনগুলিতে প্রভাবশালী জিসি সিস্টেমটি কী) গিসি'র সার্কুলার রেফারেন্সগুলিতে খুব বেশি সমস্যা হওয়া উচিত নয়।
0fnt

1
যদি C-> A -> B -> Aএবং Bএকটি পুরা হয় Collectionতারপর Aও তার সব শিশুদের এখনও পৌঁছানো হয়, এসব সম্পূর্ণরূপে স্পষ্ট হয়ে ওঠে না এবং সূক্ষ্ম হতে পারে তথ্য ফাঁসেরGCসমস্যাগুলির মধ্যে সর্বনিম্ন, সিরিয়ালায়ন এবং গ্রাফের deserialization জটিলতার একটি দুঃস্বপ্ন।

2

হ্যাঁ, উভয় উপায়েই এখানে সুবিধা রয়েছে এবং একটি সমঝোতাও রয়েছে।

List<int>:

  • স্মৃতি সংরক্ষণ করুন
  • দ্রুততর সূচনা User
  • আপনার ডেটা একটি রিলেশনাল ডাটাবেস (এসকিউএল) থেকে আসে, আপনি অ্যাক্সেস করার জন্য ব্যবহারকারীদের পেতে দুই টেবিল, শুধু হবে না Usersটেবিল

List<Book>:

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

আপনার যদি কোনও স্মৃতি বা সিপিইউ উদ্বেগ না থাকে তবে আমি List<Book>যে কোডটি ব্যবহার Userকরব সেগুলি ক্লিন হবে।

সমঝোতা:

লিনক 2 এসকিউএল ব্যবহার করার সময়, সত্তা ব্যবহারকারীর জন্য উত্পন্ন কোডটিতে EntitySet<Book>অ্যাক্সেস থাকবে যখন আপনি এটি অ্যাক্সেস করবেন। এটি আপনার কোডটি পরিষ্কার রাখতে হবে এবং ব্যবহারকারীর উদাহরণ ছোট থাকবে (মেমরির পদচিহ্ন বুদ্ধিমান)।


কিছু ধরণের ক্যাশে ধরে নেওয়া, প্রিলোডিং সুবিধাটি শূন্য হবে। আমি ক্যাসান্দ্রা / এইচবেস ব্যবহার করি নি তাই তাদের সম্পর্কে কথা বলতে পারি না তবে লিনক টু এসকিউএল একটি খুব নির্দিষ্ট কেস (যদিও আমি দেখতে পাচ্ছি না যে অলস লোডিং এই নির্দিষ্ট ক্ষেত্রে এমনকি সীমিত ক্ষেত্রেও অসীম শৃঙ্খলা রোধ করবে এবং সাধারণ ক্ষেত্রে)
0fnt

লিনক 2 এসকিউএল উদাহরণে আপনি সত্যিই কোনও পারফরম্যান্স সুবিধা পাবেন না, কেবল ক্লিনার কোড। ক্যাসান্দ্রা / এইচবেসের মতো কোনও ডকুমেন্ট স্টোর থেকে একাধিক সত্তা পাওয়ার সময়, প্রসেসিংয়ের বেশিরভাগ সময় রেকর্ডটি সন্ধান করতে ব্যয় হয়, সুতরাং আপনি সেখানে থাকার সময় সমস্ত সত্ত্বা পেতে পারেন (বইগুলি, এই উদাহরণ)।
ytoledano

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

1

থাম্বের সংক্ষিপ্ত এবং সহজ নিয়ম:

আইডিগুলি ডিটিও-তে ব্যবহৃত হয় ।
অবজেক্ট রেফারেন্স সাধারণত ডোমেন লজিক / বিজনেস লজিক এবং ইউআই লেয়ার অবজেক্টে ব্যবহৃত হয়।

এটি বৃহত্তর, এন্টারপ্রাইজ পর্যাপ্ত প্রকল্পগুলির সাধারণ স্থাপত্য। আপনার কাছে এমন ম্যাপার রয়েছে যা এই দুই ধরণের অবজেক্টে অনুবাদ করে এবং ফ্রো করে।


থামিয়ে এবং উত্তর দেওয়ার জন্য আপনাকে ধন্যবাদ। দুর্ভাগ্যক্রমে, আমি যখন উইকি লিঙ্কটির জন্য পার্থক্যটি উপলব্ধি করতে পারি তখনও আমি এটিকে বাস্তবে কখনও দেখিনি (মঞ্জুর আমি বড় দীর্ঘমেয়াদী প্রকল্পগুলির সাথে কখনও কাজ করি নি)। আপনার কি এমন উদাহরণ রয়েছে যেখানে দুটি ভিন্ন উদ্দেশ্যে একই জিনিস দুটি উপায়ে উপস্থাপিত হয়েছিল?
0fnt

এখানে প্রকৃত ম্যাপিং বিষয়ে প্রশ্ন হচ্ছে, stackoverflow.com/questions/9770041/dto-to-entity-mapping-tool - এবং এই মত সমালোচনামূলক প্রবন্ধ আছেন: rogeralsing.com/2013/12/01/...
herzmeister

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

দেখব সংগ্রহস্থলের প্রয়োগ প্যাটার্ন । আপনার একটি BookRepositoryএবং একটি হবে UserRepository। আপনি সর্বদা কল myRepository.GetById(...)বা অনুরূপ থাকবেন, এবং সংগ্রহশালাটি বস্তুটি তৈরি করবে এবং একটি ডেটা স্টোর থেকে এর মানগুলি লোড করবে, বা এটি একটি ক্যাশে থেকে পাবে। এছাড়াও, শিশুদের অবজেক্টগুলি বেশিরভাগ ক্ষেত্রে অলস বোঝাইযুক্ত, যা নির্মাণের সময় সরাসরি বৃত্তাকার উল্লেখগুলি মোকাবেলা করতে বাধা দেয়।
হার্জমিস্টার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.