ধরা যাক আমার কাছে আইটেমের একটি টেবিল রয়েছে:
CREATE TABLE items
(
item serial PRIMARY KEY,
...
);
এখন আমি প্রতিটি আইটেমের জন্য "অনুমতি" (দয়া করে মনে রাখবেন, আমি ধারণা পরিচয় করিয়ে দিতে চাই না এখানে ডাটাবেসের অ্যাক্সেস অনুমতি বিষয়ে কথা, কিন্তু বিজনেস লজিক অনুমতি ঐ আইটেমটির জন্য)। প্রতিটি আইটেমের ডিফল্ট অনুমতি এবং প্রতি ব্যবহারকারী অনুমতি যা ডিফল্ট অনুমতিগুলি ওভাররাইড করতে পারে has
আমি এটিকে বাস্তবায়নের বিভিন্ন উপায় সম্পর্কে চিন্তা করার চেষ্টা করেছি এবং নিম্নলিখিত সমাধানগুলি নিয়ে এসেছি, তবে আমি নিশ্চিত নই যে কোনটি সর্বোত্তম এবং কেন:
1) বুলিয়ান সমাধান
প্রতিটি অনুমতি জন্য একটি বুলিয়ান কলাম ব্যবহার করুন:
CREATE TABLE items
(
item serial PRIMARY KEY,
can_change_description boolean NOT NULL,
can_change_price boolean NOT NULL,
can_delete_item_from_store boolean NOT NULL,
...
);
CREATE TABLE item_per_user_permissions
(
item int NOT NULL REFERENCES items(item),
user int NOT NULL REFERENCES users(user),
PRIMARY KEY(item, user),
can_change_description boolean NOT NULL,
can_change_price boolean NOT NULL,
can_delete_item_from_store boolean NOT NULL,
...
);
সুবিধা : প্রতিটি অনুমতি নামকরণ করা হয়।
অসুবিধাগুলি : এমন কয়েক ডজন অনুমতি রয়েছে যা কলামগুলির সংখ্যা উল্লেখযোগ্যভাবে বৃদ্ধি করে এবং আপনি সেগুলি দুবার সংজ্ঞা দিতে হবে (প্রতিটি টেবিলে একবার)।
2) পূর্ণসংখ্যা সমাধান
একটি পূর্ণসংখ্যা ব্যবহার করুন এবং এটি একটি বিটফিল্ড হিসাবে বিবেচনা করুন (যেমন বিট 0 এর জন্য can_change_description
, বিট 1 এর জন্য can_change_price
, এবং আরও কিছু, এবং অনুমতিগুলি সেট করতে বা পড়তে বিটওয়াইজ অপারেশনগুলি ব্যবহার করুন)।
CREATE DOMAIN permissions AS integer;
সুবিধা : খুব দ্রুত।
অসুবিধাগুলি : আপনাকে ডাটাবেস এবং ফ্রন্ট-এন্ড ইন্টারফেস উভয় ক্ষেত্রে কোন বিটের জন্য কোন বিট দাঁড়ায় তা ট্র্যাক করে রাখতে হবে।
3) বিটফিল্ড সমাধান
একই হিসাবে 2), কিন্তু ব্যবহার bit(n)
। সম্ভবত একই সুবিধা এবং অসুবিধাগুলি, সম্ভবত কিছুটা ধীর।
4) এনাম সলিউশন
অনুমতিগুলির জন্য একটি এনাম টাইপ ব্যবহার করুন:
CREATE TYPE permission AS ENUM ('can_change_description', 'can_change_price', .....);
এবং তারপরে ডিফল্ট অনুমতিগুলির জন্য একটি অতিরিক্ত টেবিল তৈরি করুন:
CREATE TABLE item_default_permissions
(
item int NOT NULL REFERENCES items(item),
perm permission NOT NULL,
PRIMARY KEY(item, perm)
);
এবং প্রতি ব্যবহারকারী সংজ্ঞা টেবিল এ পরিবর্তন করুন:
CREATE TABLE item_per_user_permissions
(
item int NOT NULL REFERENCES items(item),
user int NOT NULL REFERENCES users(user),
perm permission NOT NULL,
PRIMARY KEY(item, user, perm)
);
সুবিধা : পৃথক অনুমতিগুলির নামকরণ করা সহজ (আপনার বিট পজিশন পরিচালনা করতে হবে না)।
অসুবিধাগুলি : কেবলমাত্র ডিফল্ট অনুমতিগুলি পুনরুদ্ধার করার জন্য, এর জন্য দুটি অতিরিক্ত টেবিল অ্যাক্সেস করা দরকার: প্রথমত, ডিফল্ট অনুমতিগুলির সারণী এবং দ্বিতীয়টি, এনাম মানগুলি সংরক্ষণ করে সিস্টেম ক্যাটালগ।
বিশেষত যেহেতু ডিফল্ট অনুমতিগুলি অবশ্যই সেই আইটেমটির প্রতিটি একক পৃষ্ঠাগুলির জন্য পুনরুদ্ধার করতে হবে , শেষ বিকল্পটির কার্যকারিতা প্রভাবটি উল্লেখযোগ্য হতে পারে।
5) এনাম অ্যারে সমাধান
4 হিসাবে একই) তবে সমস্ত (ডিফল্ট) অনুমতি ধরে রাখতে একটি অ্যারে ব্যবহার করুন:
CREATE TYPE permission AS ENUM ('can_change_description', 'can_change_price', .....);
CREATE TABLE items
(
item serial PRIMARY KEY,
granted_permissions permission ARRAY,
...
);
সুবিধা : পৃথক অনুমতিগুলির নামকরণ করা সহজ (আপনার বিট পজিশন পরিচালনা করতে হবে না)।
অসুবিধাগুলি : 1 ম সাধারণ ফর্মটি ভঙ্গ করে এবং কিছুটা কুৎসিত। অনুমতিগুলির সংখ্যা বৃহত্তর হলে (প্রায় 50) এক সারিতে যথেষ্ট পরিমাণে বাইট নেয়।
আপনি কি অন্যান্য বিকল্পের কথা ভাবতে পারেন?
কোন পন্থা গ্রহণ করা উচিত এবং কেন?
দয়া করে মনে রাখবেন: এটি স্ট্যাকওভারফ্লোতে পোস্ট করা একটি প্রশ্নের একটি সংশোধিত সংস্করণ ।
bigint
ক্ষেত্রগুলি বেছে নিতে পারি (প্রতিটি 64 টি বিটের জন্য ভাল) বা কিছুটা স্ট্রিং। আমি এসও-তে সম্পর্কিত