ডাটাবেসে বিট মাস্ক ব্যবহারের সুবিধা এবং অসুবিধা


22

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


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

1
আপনি যদি যোগ না ব্যবহার করেন তবে আপনি নিজের সম্পর্কিত ডেটাবেসটি যেভাবে ব্যবহার করছেন তা ব্যবহার করছেন না।
পিটার বি

উত্তর:


38

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

আপনি যদি ইতিমধ্যে একটি সম্পর্কিত ডেটাবেস ব্যবহার করেন তবে এটি একটি বিরোধী-প্যাটার্ন যা বেশিরভাগ সম্পর্কিত তত্ত্ব এবং সমস্ত নরমালাইজেশন বিধি লঙ্ঘন করে। আপনি যখন নিজের ডেটা স্টোরেজ তৈরি করেন তখন এটি এমন খারাপ ধারণা নাও থাকতে পারে।

অনেকগুলি সারণী যোগদানের মতো একটি জিনিস রয়েছে তবে এটি পরিচালনা করতে রিলেশনাল ডাটাবেসগুলি নির্মিত। পারফরম্যান্স একটি সমস্যা হয়ে উঠলে অনেকের অতিরিক্ত বৈশিষ্ট্য থাকে: সূচকগুলি, সূচীকরণ ভিউস ইত্যাদি Even ডাটাবেসে খুব সহজ।

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

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


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

3
সম্মত, আমি এমন একটি অ্যাপ্লিকেশন সমর্থন করি যা ব্যবহারকারীর ভূমিকা এবং এর ডেটাবেজে সুবিধার্থে বিট মাস্ক ব্যবহার করে। এটি একটি দুঃস্বপ্ন ছিল। একটি 32 বিট ইনট ব্যবহার করে, আমরা বিটগুলি ছুঁড়েছি, তাই কারও কাছে আরও বিট মাস্ক যুক্ত করার দুর্দান্ত ধারণা ছিল এবং তারপরে ওভারল্যাপগুলি, তাই একটি কলামে বিট 4 এর অর্থ এই অন্য কলামের বিট 8, এবং সেগুলি সিঙ্কের বাইরে চলে গেল। আয়ে আয়ে আয়ে। সূচীকরণ করা শক্ত ছিল কারণ সূচকগুলি পৃথক বিটগুলিতে আলাদা কলামের মানগুলি পৃথক করে না, তাই আপনি সারি where some_bit_mask & 12 > 0সারি স্ক্যান ছাড়াই সারিগুলি অনুসন্ধান করতে পারবেন না ।
ব্র্যান্ডন

দিন শেষে, অনেকগুলি থেকে অনেকগুলি user_role_mapবা user_priv_mapটেবিলই যথেষ্ট হত।
ব্র্যান্ডন

@ মাইকম্যাকমাহোন, আপনি কি টেবিল ডিজাইনের আরও গভীরভাবে ডুব দিতে পারবেন এবং আপনি যে ফলাফলটি সম্পর্কে কথা বলছেন তা অর্জনের জন্য আমি কীভাবে কোডটিতে এটি মানচিত্র করব?
অ্যালেক্স ওভেচকিন

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

24

আপনি ইতিমধ্যে প্রাসঙ্গিক উপকারিতা এবং কনস নামকরণ করেছেন:

  • বিট ক্ষেত্রগুলি স্থান বাঁচায়।
  • এগুলি নিজেই রেকর্ডে ডেটা সঞ্চয় করে, তাই এটিগুলি খুঁজে পেতে আপনার যোগদানের দরকার নেই। (তবে রেকর্ডে পৃথক পতাকা ক্ষেত্রগুলি একই কাজ করবে))
  • আপনি যদি কাঁচা এসকিউএল আউটপুট নিয়ে উত্পাদনশীলভাবে কাজ করতে চান তবে সেগুলি খারাপভাবে পঠনযোগ্য।

কী করবেন তা সিদ্ধান্ত নেওয়ার জন্য আরও তথ্যের প্রয়োজন:

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

সুতরাং আপনাকে যা করতে হবে তা হ'ল ঝুঁকির কারণগুলি সংগ্রহ করা এবং তারপরে তাদের ওজন করা , এটি দেখার পক্ষে যে উপকারিতা তুলনামূলক বেশি।


আপনার উত্তরের জন্য আপনাকে ধন্যবাদ, আপনার চিন্তাধারার সাথে সম্পূর্ণ একমত, তবে সাধারণভাবে এটি কি এন্টি-প্যাটার্ন বা না? এবং আপনি কি আপনার প্রকল্পগুলিতে মুখোশ ব্যবহার করেন?
অ্যালেক্স ওভেচকিন

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

স্থান যুক্তিটিকে "গিম্ম" হিসাবে গ্রহণ করা। কিছুটা মুখোশ ব্যবহার করতে হবে কিনা তা নিয়ে প্রশ্ন আসে যে এটি এর উপরে এবং উপরে কোনও উপকার করে।
রবি ডি

এছাড়াও আপনার প্রত্যেককে ডেটাবেজে তথ্য প্রক্রিয়াকরণ করা দরকার, বা এটি সর্বদা প্রয়োগ করার আগে কোনও অ্যাপ্লিকেশনটিতে পড়ে।
আয়ান

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

18

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

আপনি অ্যামাজন বা নেটফ্লিক্স না থাকলে ব্যবহারকারীর অনুমতিগুলির সাথে জড়িত ডেটার পরিমাণ আপনার কাছে থাকা সমস্ত কিছুর তুলনায় নগণ্য হবে।

কোনও গুরুতর ডিবিএমএস ঝাঁকুনি ছাড়াই সেই "অতিরিক্ত যোগদান" পরিচালনা করতে পারে।


7
+1: ভাল রিলেশনাল ডাটাবেসগুলি এমন লোকদের দ্বারা বিকাশ করা হয় যাঁরা সত্যই সত্যই, সত্যই সত্যই তারা যা করেন তাতে ভাল। বিট ক্ষেত্রগুলি ব্যবহার করে আপনি যে পারফরম্যান্সের শেষ বিটটি পেতে পারেন তার স্তরের যে কোনও ব্যক্তিকে প্রশ্ন জিজ্ঞাসা করার প্রয়োজন হবে না। ডেটা মডেল করুন, তারপরে যে অংশগুলি সম্পাদন করছে না তা সন্ধান করুন।
blrfl

যোগদানের ফলে অ্যাপ্লিকেশন কোড আরও জটিল হয়ে উঠবে, তাই ভূমিকাগুলি যেখানে প্রক্রিয়াজাত হয় সেখানে নেমে আসে।
ইয়ান

4
@ বিটমাস্ক অনুমতিগুলি কীভাবে বোঝাতে হয় তা জেনে রাখার আগে যোগ দেওয়ার বিষয়টি আরও জটিল বলে মনে হচ্ছে না।
ব্র্যাড

@ ব্র্যাড, এমন একটি এনামের কথা চিন্তা করুন যা সি # তে পতাকার একটি সেট, এটির মান ডাটাবেসে "যেমন আছে" সঞ্চিত থাকে, সি # ঠান্ডা কোনও সহজ পেতে পারে না। যদি কোনও যোগদান ব্যবহার করা হয়, তবে সি # কোডটিকে একটি "1 থেকে অনেকের" সম্পর্কের সাথে মানিয়ে নিতে হবে।
আয়ান

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

8

ফিরে যখন স্টোরেজ ব্যয়বহুল ছিল, বিট মাস্কগুলির সাথে वरदान হ'ল তারা স্থান সংরক্ষণ করেছিল। বড় ডেটার দিনগুলিতে, এটি একবার ছিল এমন ইস্যু নয়।

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

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


2

বিটমাস্কগুলি ব্যবহার করার একমাত্র সুবিধা হ'ল বিট ক্ষেত্রগুলির অর্থ স্থিতিশীল না হলে। রিলেশনাল টেবিলগুলি কেবল তখনই ভাল কাজ করে যদি আপনি আগে থেকে প্রতিটি ক্ষেত্রের রেকর্ডে কী জানেন: আপনাকে CREATE TABLEডিডিএল বিবৃতিতে ক্ষেত্রগুলি সর্বোপরি সনাক্ত করতে হবে।

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

যদি আপনি জানেন যে বিটগুলি বিকাশের সময় কী প্রতিনিধিত্ব করে তবে প্রতিটি বিটের জন্য ক্ষেত্র তৈরি করুন এবং তাদের অর্থপূর্ণ নাম দিন

কেবল অভ্যন্তরীণ প্ল্যাটফর্মের প্রভাব সম্পর্কে সতর্ক থাকুন । যদি আপনি নির্বিচারে তবে ভাল-টাইপযুক্ত ক্ষেত্রগুলি সংজ্ঞা দিয়ে শেষ করেন তবে এটি একটি জিনিস তবে আপনি যদি এর থেকে অনেক বেশি এগিয়ে যান তবে আপনি একটি সম্পর্কযুক্ত ডাটাবেসের অভ্যন্তরে একটি রিলেশনাল ডাটাবেস পুনরায় উদ্ভাবন করবেন।


2

আমি বিটমাস্ক সম্পর্কে দ্বিধাহীন। আমি খুঁজে পাই তাদের বেশিরভাগ প্রতিরোধকারী বাইনারি এবং হেক্সাডেসিমাল বুঝতে পারে না। স্বচ্ছতার জন্য, ভাল মিমোনমিক্স ব্যবহার করুন।

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

না, বিট মাস্কগুলি সূচিযুক্ত করা যাবে না তবে 33 সূচি তৈরি করা হাস্যকর এবং ক্রলটিতে সন্নিবেশকে ধীর করে দেবে। সারণী অনুসন্ধানগুলি তারিখগুলি রেকর্ড করে এবং "মালিকদের" সূচকগুলি রেকর্ড করে, তাই এই বিট মাস্কের সূচিগুলি, যদি সম্ভব হয় তবে কখনই ব্যবহৃত হবে না।


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

1

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

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

তবে কিছু ক্ষেত্রে আছে, যা বিট ক্ষেত্রের ব্যবহারকে ন্যায়সঙ্গত করতে পারে:

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