ব্যবহারকারীদের সংজ্ঞায়িত ক্ষেত্রগুলিকে অনুমতি দেওয়া কি খারাপ অভ্যাস?


17

সাধারণভাবে বলতে গেলে, কোনও ওয়েবঅ্যাপের ডেটাবেজে ব্যবহারকারীর তৈরি ক্ষেত্রগুলিকে অনুমতি দেওয়া কি খারাপ অভ্যাস হিসাবে বিবেচিত হয়?

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

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

যদিও সাধারণভাবে বলতে গেলে লোকেরা কীভাবে "বাস্তবজীবনে" এমন কিছু পরিচালনা করে?


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

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

সমস্ত: দুর্দান্ত আলোচনা, সমস্ত অন্তর্দৃষ্টি জন্য ধন্যবাদ! @ অ্যান্ডিবার্শ আমি মঙ্গোডিবি-র কথা শুনেছি কিন্তু সত্যিই এটি কখনই পড়েনি। পরীক্ষার জন্য অন্য হোম প্রকল্পের মতো মনে হচ্ছে ...
zako42

উত্তর:


19

আপনি যখন "ব্যবহারকারীর সংজ্ঞায়িত ক্ষেত্রগুলি" পেতে শুরু করেন যা প্রায়শই বাগ ট্র্যাকার, গ্রাহক সংস্থান ব্যবস্থাপনা এবং একই ধরণের ব্যবসায়ের সরঞ্জামগুলিতে পাওয়া যায় তা হ'ল এগুলিতে বাজিলিয়ান ক্ষেত্রগুলি সহ কোনও টেবিলের সাহায্যে ব্যাক করা হয় না (যদি তারা থাকে তবে সম্ভবত সমস্যাটির সমস্যা আছে) নিজস্ব).

পরিবর্তে আপনি যা সন্ধান করেন তা হ'ল বৈধ বৈশিষ্ট্যগুলি পরিচালনা করার জন্য এন্টি অ্যাট্রিবিউট মান সারণি ডিজাইন এবং সম্পর্কিত প্রশাসন সরঞ্জাম।

নিম্নলিখিত টেবিলটি বিবেচনা করুন:

  + + -------------- + +
  | জিনিস |
  | -------------- |
  | আইডি |
  | প্রকার |
  | desc |
  | attr1 |
  | attr2 |
  | attr3 |
  | attr4 |
  | attr5 |
  + + -------------- + +

আপনি কয়েকটি অ্যাট্রিবিউট যুক্ত করার পরে এটি। বদলে attr1সাজা এটি সার্চ artistবা tracksবা genreবা যাই হোক না কেন বৈশিষ্ট্যাবলী জিনিস হয়েছে। এবং 5 এর পরিবর্তে, এটি 50 হলে কী হবে ly স্পষ্টতই এটি নিয়ন্ত্রণহীন। একটি নতুন ক্ষেত্র পরিচালনা করতে এটির জন্য মডেলটির একটি আপডেট এবং অ্যাপ্লিকেশনটির পুনরায় নিয়োগের প্রয়োজন requires আদর্শ নয়।

এখন নিম্নলিখিত টেবিল কাঠামো বিবেচনা করুন:

  + -------------- + + --------------- + + ------------- +
  | জিনিস | | জিনিস_আত্র | | attr |
  | -------------- | | --------------- | | ------------- |
  | আইডি | <--- + | | জিনিস_আইডি (এফকে) | + +> | আইডি |
  | প্রকার | | attr_id (fk) | + - + | নাম |
  | desc | | মান | | |
  + -------------- + + --------------- + + ------------- +

আপনি আপনার জিনিসটিকে এর প্রাথমিক ক্ষেত্রগুলি দিয়ে পেয়েছেন। আপনার আরও দুটি টেবিল রয়েছে। বৈশিষ্ট্য সহ একটি। প্রতিটি ক্ষেত্র attrসারণীতে একটি সারি । এবং তারপরে টেবিলে এবং টেবিলের thing_attrসাথে সম্পর্কিত একজোড়া বিদেশী কী রয়েছে। এবং এরপরে এটির একটি মান ক্ষেত্র রয়েছে যেখানে আপনি সেই সত্তার জন্য ক্ষেত্রের মানটি যা কিছু সঞ্চয় করেন।thingattr

এবং এখন আপনি একটি কাঠামো পেয়েছেন যেখানে রানটাইমের সময় অ্যাটর টেবিল আপডেট করা যায় এবং সামগ্রিক প্রয়োগের উল্লেখযোগ্য প্রভাব ছাড়াই ফ্লাইতে নতুন ক্ষেত্রগুলি যুক্ত করা (বা অপসারণ) করা যেতে পারে।

অনুসন্ধানগুলি কিছুটা জটিল এবং বৈধতা খুব জটিল হয়ে ওঠে (হয় মজাদার সঞ্চিত পদ্ধতি বা সমস্ত ক্লায়েন্টের পক্ষ)। এটি ডিজাইনের একটি বাণিজ্য।

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


রানটাইমে স্কিমা পরিবর্তন করার জন্য কি কোনও ডাউনসাইড রয়েছে? ব্যবহারকারী যদি মনে করেন যে কোনও জিনিসের কোনও নতুন বৈশিষ্ট্য প্রয়োজন, কেবল গতিশীলভাবে টেবিলটিতে একটি কলাম যুক্ত করতে চান?

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

আপনি যদি পরিবর্তে কোনও সম্পর্কিত ডেটাবেসে কাজ করছেন - আপনার স্কিমা থাকা দরকার। কলামটি গতিশীলভাবে যুক্ত করার অর্থ নিম্নলিখিত জিনিসগুলির কিছু উপসেট সত্য:

  • আপনি মেটা-ডাটাবেস প্রোগ্রামিং করছেন। এই কলামটি একটি দুর্দান্ত ওআরএম দিয়ে পরিষ্কারভাবে সেই ক্ষেত্রটিতে ম্যাপ করার সুযোগ না দিয়ে আপনি সম্ভবত select *ডেটা আসলে কী তা জানার জন্য কিছু জটিল কোড করছেন এবং তারপরে ( জাভার রেজাল্টসেটমেটাডেটা দেখুন ) এবং তারপরে একটি মানচিত্রে সংরক্ষণ করছেন ( বা অন্য কিছু ডেটাটাইপ - তবে কোডে ভাল ক্ষেত্র নয় )। এটির পরে প্রথাগত পদ্ধতির সাথে আপনার টাইপ এবং সুরক্ষার মোটামুটি কিছু ছুঁড়ে যায়।
  • আপনি সম্ভবত ORM পরিত্যাগ করেছেন। এর অর্থ আপনি সিস্টেমে আপনার জন্য কাজটি না করার পরিবর্তে সমস্ত কোডের জন্য কাঁচা এসকিএল লিখছেন।
  • আপনি ক্লিন আপগ্রেড করা ছেড়ে দিয়েছেন। যখন গ্রাহক আপনার পরবর্তী সংস্করণটিও ব্যবহার করে এমন একটি নাম যুক্ত একটি ক্ষেত্র যুক্ত করে তখন কী ঘটে? ম্যাচমেকিং সাইটটিতে hasdateএকটি টাইমস্ট্যাম্প সংরক্ষণের জন্য একটি ক্ষেত্র যুক্ত করতে চায় এমন আপগ্রেডটিকে ইতিমধ্যে hasdateএকটি সফল ম্যাচের জন্য বুলিয়ান হিসাবে সংজ্ঞায়িত করা হয়েছে ... এবং আপনার আপগ্রেড ব্রেক।
  • আপনি বিশ্বাস করছেন যে গ্রাহক এমন কিছু সংরক্ষিত শব্দ ব্যবহার করে সিস্টেমটি ভাঙ্গেন না যা আপনার কোয়েরিও ভেঙে দেয় ... কোথাও।
  • আপনি নিজেকে একটি ডাটাবেস ব্র্যান্ডের সাথে আবদ্ধ করেছেন। DDL বিভিন্ন ডেটাবেসের ভিন্ন। ডাটাবেস টাইপগুলি এটির সবচেয়ে সহজ উদাহরণ। varchar2বনাম textএবং মত। কলামটি যুক্ত করার কোডটি মাইএসকিউএলে কাজ করবে তবে পোস্টগ্রিস বা ওরাকল বা এসকিউএল সার্ভার নয়।
  • আপনি কি গ্রাহকে আসলে ডেটাটি ভালভাবে যুক্ত করতে বিশ্বাস করেন ? অবশ্যই, EAV আদর্শ থেকে অনেক দূরে তবে এখন আপনি এমন কিছু ভয়াবহ অস্পষ্ট টেবিলের নাম পেয়েছেন যা আপনি বিকাশকারী যুক্ত করেন নি, ভুল ধরণের সূচক (যদি থাকে) সহ কোডটিতে কোনও বাধা যুক্ত করা হয়নি যেখানে প্রয়োজন রয়েছে হতে হবে এবং তাই।
  • আপনি অ্যাপ্লিকেশনটি চালিত ব্যবহারকারীর জন্য স্কিমা পরিবর্তনের সুযোগসুবিধা দিয়েছেন। লিটল ববি ড্রপ টেবিলগুলি যখন আপনি ডিডিএল এর পরিবর্তে এসকিউএল-তে সীমাবদ্ধ থাকেন তখন সম্ভব হয় না (এটির পরিবর্তে আপনি এটি করতে পারেন তা নিশ্চিত delete * from students, তবে আপনি খারাপ উপায়ে ডাটাবেসটিকে জগাখিচু করতে পারবেন না)। কোনও দুর্ঘটনা বা দূষিত ক্রিয়াকলাপের স্ক্রোককেট থেকে স্কিমা অ্যাক্সেসের সাথে যে জিনিসগুলি ভুল হতে পারে তার সংখ্যা।

এটি সত্যিই "এটি করবেন না" এ ফোটে। আপনি যদি সত্যিই এটি চান তবে EAV টেবিল কাঠামোর একটি পরিচিত প্যাটার্ন বা পুরোপুরি এই কাঠামোর জন্য উত্সর্গীকৃত একটি ডেটাবেস সহ যান। লোককে কোনও সারণীতে স্বেচ্ছাসেবী ক্ষেত্র তৈরি করতে দেবেন না। মাথাব্যথা ঠিক এটি মূল্যহীন।


4
আপনি ডাটাবেসটিও নতুনভাবে তৈরি করেছেন।
ব্যবহারকারী 253751

1
@ মিমিবিস এতে একটি স্তর যুক্ত করেছে যাতে ব্যবহারকারী বাকী ডাটাবেস ম্যাংলিং না করে বা মডেলটি আপডেট করার জন্য পুনরায় নিয়োগের প্রয়োজন ছাড়াই পরিচালনা করতে পারে।

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

1
@ শিভানড্রাগন যা নোএসকিউএল পদ্ধতির দিকে যায়। ডকুমেন্ট স্টোরটি কেবলমাত্র নথি সংরক্ষণ করে এবং কোনও স্কিমা চাপায় না। যেমন, ক্ষেত্রগুলি যুক্ত করা এবং সরিয়ে ফেলা এবং দস্তাবেজগুলি বিশ্লেষণ করা সম্পূর্ণভাবে ডাটাবেসের সুযোগের বাইরে (এবং আপনি এটির জন্য আপনার মডেল লিখেছেন)। এটি একটি EAV কাঠামোর জন্য সম্পর্কিত ডেটাবেস আপোষের তুলনায় সম্পূর্ণ পৃথক সমঝোতা।

1
সম্পর্কিত চ্যাট আলোচনা: ইভটির ডাটাবেস ডিজাইনের বিকল্পগুলিতে

5

এটি ভাল করা কঠিন।

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


সংক্ষেপে: ছোট প্রকল্প == কেআইএসএস। মাটিতে নামলে চটপটে।
এনকেইটার

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

0

আমি সম্প্রতি কিছু একই জিনিস ক্রস এসেছি।

আমি 2 টেবিল তৈরি।

1: table Objects 
    Id , name, type

তিনি আপনার সমস্ত জিনিস। আপনি এটির নাম রেখেছেন।

এবং এই অবজেক্টের একটি প্রকার: - আমার জন্য উপলব্ধ প্রকারগুলি ছিল ইনভেন্টরি, ইনভেন্টরি_টিম, অফিস।

এবং সাধারন সেটআপ ছিল এন আইটেমগুলি চাইল্ড বা ইনভেন্টরি যা অফিসেরও শিশু এবং আমি একে অপরের সাথে যুক্ত হওয়ার জন্য একটি টেবিল ব্যবহার করেছি

2 table settings 
     organization_Id , title, value , type

সেটিংস টেবিলটিতে সেই নির্দিষ্ট অবজেক্টের ধরণের প্রতিটি ক্ষেত্রের নাম এবং মানের মান থাকে।

অফিস বৈশিষ্ট্য উদাহরণ

অবস্থান, ফোন, কাজের সময়

এবং আইটেম জন্য

  • পরিমাণ
  • মূল্য
  • বারকোড

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

সুতরাং যখনই আমি কোনও অফিস চাই তখন আমি তার সমস্ত সম্পর্ক এবং সেটিংসের সাথে সেটিংস সহজেই লোড করি যেখানে সেটিংস বস্তুযুক্ত হয় (অনুরোধকৃত বস্তুগুলি)

এর পরে আমি সেটিংস থেকে সমস্ত সারি পিভট করেছি এবং এটিই।

এবং যদি আমি কোনও তালিকাতে কোনও আইটেমের সাথে নির্দিষ্ট হয়ে থাকতে চাই (বিশ্বব্যাপী নয়) আমি অবজেক্ট_আই'ড = আমি অবজেক্ট_বজেক্টস রিলেশন টেবিল থেকে এসেছি এবং সেটিংস সেট করেছি ty টাইপ = রিলেশন_সেটিং

আমি আশা করি আপনি ল্যাপটপে উঠলে আমি উত্তরটি পুনরায় ফর্ম্যাট করার চেষ্টা করব তার অর্থটি বুঝতে পেরেছি


2
প্রো টিপ - আপনার ফোন থেকে এই ফোরামে পোস্ট করবেন না। স্বতঃ-সংশোধন আপনার পোস্টের কিছু অংশ অপঠনযোগ্য করে তোলে।
ববডালগাইশ

হাহা সুন্দর পর্যবেক্ষণ :)
জালবোজা

0

ব্যবহারকারীদের সংজ্ঞায়িত ক্ষেত্রগুলিকে অনুমতি দেওয়া কি খারাপ অভ্যাস?

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

যদিও সাধারণভাবে বলতে গেলে লোকেরা কীভাবে "বাস্তবজীবনে" এমন কিছু পরিচালনা করে?

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

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

যদি স্থান / স্বাভাবিককরণ আপনার জন্য সবচেয়ে গুরুত্বপূর্ণ এবং আরও জটিল প্রশ্নগুলির জন্য আপনার সমস্যা না হয় তবে আপনি "প্রতি-সারণী-প্রতি-সারণী" স্কিমা বাস্তবায়ন করবেন।

আরও তথ্যের জন্য দেখুন ডটনেট টেবিল-প্রতি-টাইপ-বনাম-টেবিল-প্রতি-শ্রেণিবদ্ধ-উত্তরাধিকার বা জাভা হাইবারনেট উত্তরাধিকার


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