রিলেশনাল ডাটাবেসে তালিকাগুলি ব্যবহার করা কি কখনও ঠিক আছে?


94

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

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

অবশ্যই, যদি আমি "ব্যক্তি" এ স্বতন্ত্রভাবে এই কাজগুলি সংরক্ষণ করি তবে আমার কাছে কয়েক ডজন ডামি "টাস্কআইডি" কলাম থাকতে হবে এবং সেগুলি মাইক্রো-ম্যানেজ করতে হবে কারণ বলুন যে কোনও ব্যক্তির কাছে 0 থেকে 100 টি কার্য থাকতে পারে, বলুন।

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

এই জাতীয় সমস্যার জন্য, আইডিগুলির একটি ফর্ম বা অন্য রূপ গ্রহণের একটি তালিকা সংরক্ষণ করা ঠিক আছে বা আমি কি নীতিমালা ভঙ্গ না করে কেবল অন্য উপায়ে এটি অর্জনযোগ্য তা ভাবছি না?


22
আমি বুঝতে পারছি এই বাঁধা হয় "রিলেশনাল ডাটাবেস" তাই আমি এটা একটি মন্তব্য নয় উত্তর হিসাবে ছেড়ে দেব, কিন্তু ডাটাবেস অন্যান্য ধরনের এটা করে তালিকা সংরক্ষণ করতে অর্থে দেখা যায়। কাসান্দ্রার মনে আসেনি যেহেতু এটির সাথে যোগ দেয় না।
ক্যাপ্টেন ম্যান

12
গবেষণা এবং তারপর এখানে জিজ্ঞাসা ভাল কাজ! প্রকৃতপক্ষে, 1 ম স্বাভাবিক ফর্মটি কখনও লঙ্ঘন করার 'সুপারিশ' আপনার পক্ষে সত্যিই ভাল হয়েছিল, কারণ আপনার সত্যিকার অর্থেই অন্য একটি, আপেক্ষিক পদ্ধতির সাথে আসা উচিত, যথা একটি "বহু থেকে বহু" সম্পর্ক, যার জন্য এখানে একটি স্ট্যান্ডার্ড প্যাটার্ন রয়েছে রিলেশনাল ডাটাবেস যা ব্যবহার করা উচিত।
জিমিবি

6
"এটি কি কখনও ঠিক আছে" হ্যাঁ .... যা যা অনুসরণ করে, উত্তর হ্যাঁ। যতক্ষণ না আপনার একটি বৈধ কারণ রয়েছে। সর্বদা এমন ব্যবহারের কেস রয়েছে যা আপনাকে সেরা অনুশীলনগুলি লঙ্ঘন করতে বাধ্য করে কারণ এটি করা বোধগম্য। (আপনার ক্ষেত্রে, আপনার অবশ্যই হওয়া উচিত নয়)
xyious

3
আমি বর্তমানে একটি অ্যারের (ব্যবহার করছি না - একটি একটি সীমায়িত স্ট্রিং VARCHAR ARRAYট্যাগের একটি তালিকা সংরক্ষণ করতে)। এটি সম্ভবত এই নয় যে তারা কীভাবে পরে লাইনের নীচে সঞ্চিত হবে, তবে তালিকাগুলি প্রোটোটাইপিংয়ের পর্যায়ে কার্যকর হতে পারে, যখন আপনি করার আগে পুরো ডাটাবেস স্কিমা তৈরি করতে চান না এবং আপনার কাছে আর কিছুই নেই। অন্য কিছু করুন।
নিক হার্টলি

3
@Ben " (যদিও তারা সূচিযোগ্য হবে না) " - Postgres এ, তাদেরকে JSON কলাম বিরুদ্ধে বিভিন্ন প্রশ্নের (এবং সম্ভবত এক্সএমএল, যদিও আমি চেক করি নি) হয় সূচিযোগ্য।
নিক হার্টলি

উত্তর:


249

আপনার কী কী শব্দ এবং কী ধারণাটি তদন্ত করতে হবে তা হ'ল ডাটাবেস নরমালাইজেশন

আপনি কি করবেন, ব্যক্তি বা কার্য টেবিলগুলিতে অ্যাসাইনমেন্ট সম্পর্কে তথ্য যুক্ত করার পরিবর্তে, আপনি কি সেই কাজের তথ্য সম্পর্কিত একটি নতুন টেবিল যুক্ত করছেন, যার সাথে সম্পর্কিত সম্পর্ক রয়েছে।

উদাহরণস্বরূপ, আপনার নিম্নলিখিত সারণী রয়েছে:

ব্যক্তি:

+ + ---- + + ----------- + +
| আইডি | নাম |
+ + ==== + + =========== + +
| 1 | আলফ্রেড |
| 2 | জেবেদিয়া |
| 3 | জ্যাকব |
| 4 | এজেকিয়েল |
+ + ---- + + ----------- + +

কাজ:

+ + ---- + + -------------------- + +
| আইডি | নাম |
+ + ==== + + ==================== + +
| 1 | মুরগিদের খাওয়ান |
| 2 | লাঙল |
| 3 | গরু দুধ |
| 4 | একটি শস্যাগার উত্থাপন |
+ + ---- + + -------------------- + +

তারপরে আপনি অ্যাসাইনমেন্ট সহ একটি তৃতীয় টেবিল তৈরি করবেন। এই টেবিলটি মানুষের এবং কার্যগুলির মধ্যে সম্পর্কের মডেল করবে:

+ + ---- + + ----------- + + --------- + +
| আইডি | পার্সোনআইড | টাস্কআইডি |
+ + ==== + + =========== + + ========= + +
| 1 | 1 | 3 |
| 2 | 3 | 2 |
| 3 | 2 | 1 |
| 4 | 1 | 4 |
+ + ---- + + ----------- + + --------- + +

আমাদের তখন একটি বিদেশী কী বাধা থাকবে যেমন ডাটাবেসটি প্রয়োগ করে যে পার্সোনআইড এবং টাস্কআইডস সেই বিদেশী আইটেমগুলির জন্য বৈধ আইডি হতে হবে। প্রথম সারিতে জন্য, আমরা দেখতে পারেন PersonId is 1, তাই আলফ্রেড , নির্ধারিত হয় TaskId 3, গোদোহন গরু

আপনি এখানে যা দেখতে সক্ষম হবেন তা হ'ল আপনার নিজের হাতে প্রতি কাজ হিসাবে বা ব্যক্তি হিসাবে কম বা অ্যাসাইনমেন্ট থাকতে পারে। এই উদাহরণে, এজেকিয়েল কোনও কাজ বরাদ্দ করা হয়নি, এবং আলফ্রেডকে 2 নিয়োগ করা হয়েছে। আপনার যদি 100 জন লোকের SELECT PersonId from Assignments WHERE TaskId=<whatever>;সাথে একটি কাজ থাকে, তবে 100 টি সারি ফলস্বরূপ, বিভিন্ন ব্যক্তি নিয়োগ করা হবে will আপনি WHEREসেই ব্যক্তিকে নির্ধারিত সমস্ত কার্য সন্ধান করতে পার্সনআইডিতে পারেন।

আপনি যদি নামগুলি এবং কার্যগুলি দিয়ে আইডিগুলি প্রতিস্থাপন করে প্রশ্নগুলি ফিরে আসতে চান, তবে আপনি কীভাবে সারণীগুলিতে যোগদান করবেন তা শিখবেন।


86
আপনি যে কীওয়ার্ডটি আরও জানতে সন্ধান করতে চান তা হ'ল " বহু-বহু সম্পর্কের "
ব্লুরাজা - ড্যানি ফ্লুঘুফুট

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

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

13
@ প্রতিলিপি: এটি উদ্যানের বিভিন্ন ধরণের, স্ব-বর্ধিত পূর্ণসংখ্যার প্রাথমিক কী কলামের কেবল উপস্থাপনা। খুব সাধারণ জিনিস।
কিসনেম

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

35

আপনি এখানে দুটি প্রশ্ন জিজ্ঞাসা করছেন।

প্রথমে, আপনি জিজ্ঞাসা করছেন কলামে সিরিয়ালযুক্ত তালিকা সংরক্ষণ করা ঠিক আছে কিনা। হ্যাঁ, ঠিক আছে। যদি আপনার প্রকল্পটি এটির জন্য কল করে। একটি ক্যাটালগ পৃষ্ঠার পণ্য উদাহরণ হতে পারে, যেখানে প্রতিটি উপাদান পৃথকভাবে ট্র্যাক করার আপনার ইচ্ছা নেই try

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


9
উপাদানগুলির উদাহরণ যা আপনি উল্লেখ করেছেন তা পৃষ্ঠের উপরে সঠিক; তবে এটি ক্ষেত্রে প্লেইন টেক্সট হবে। এটি প্রোগ্রামিং অর্থে কোনও তালিকা নয় (যদি না আপনি বোঝাচ্ছেন যে স্ট্রিংটি অক্ষরের একটি তালিকা যা আপনি অবশ্যই না করেন)। ওপি তাদের ডেটাগুলিকে "আইডির একটি তালিকা" হিসাবে বর্ণনা করে (বা এমনকি "[..]" এর একটি তালিকাও) বোঝায় যে তারা কোনও সময় এই তথ্যটিকে পৃথক বস্তু হিসাবে পরিচালনা করছে hand
তোলা

10
@ ফ্লাটার: তবে এটি একটি তালিকা। ওয়েব পৃষ্ঠায়, একটি সরল পাঠ্য নথিতে, একটি মোবাইলে আইটেমগুলি সঠিকভাবে প্রদর্শিত হয় তা নিশ্চিত করার জন্য আপনাকে (বিভিন্নভাবে) এইচটিএমএল তালিকা, একটি মার্কডাউন তালিকা, একটি জেএসওএন তালিকা ইত্যাদি হিসাবে পুনরায় ফর্ম্যাট করতে সক্ষম হতে হবে অ্যাপ্লিকেশন ... এবং আপনি সরল পাঠ্য সহ সত্যিই এটি করতে পারবেন না।
কেভিন

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

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

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

22

আপনি যা বর্ণনা করছেন তা আপনার Personএবং এর মধ্যে আপনার ক্ষেত্রে "অনেকের কাছে" অনেক সম্পর্ক হিসাবে পরিচিত Task। এটি সাধারণত তৃতীয় টেবিল ব্যবহার করে প্রয়োগ করা হয়, কখনও কখনও "লিঙ্ক" বা "ক্রস-রেফারেন্স" টেবিল নামে পরিচিত। উদাহরণ স্বরূপ:

create table person (
    person_id integer primary key,
    ...
);

create table task (
    task_id integer primary key,
    ...
);

create table person_task_xref (
    person_id integer not null,
    task_id integer not null,
    primary key (person_id, task_id),
    foreign key (person_id) references person (person_id),
    foreign key (task_id) references task (task_id)
);

2
আপনি task_idযদি প্রথমে কোনও কাজ অনুসারে ফিল্টার করা অনুসন্ধানগুলি করে থাকেন তবে আপনি প্রথমে একটি সূচকও যুক্ত করতে চাইতে পারেন।
jpmc26

1
ব্রিজ টেবিল হিসাবেও জানেন। এছাড়াও, আশা করি আমি পরিচয় কলাম না রাখার জন্য আপনাকে একটি অতিরিক্ত প্লাস দিতে পারতাম, যদিও আমি প্রতিটি কলামে একটি সূচকের পরামর্শ দেব।
jmoreno

13

... আইডি বা এর মতো ক্ষেত্রের তালিকা সংরক্ষণ করা কখনই (বা প্রায় কখনও নয়) ঠিক নয়

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

যেহেতু একটি "তালিকা" সংজ্ঞা অনুসারে ছোট উপাদান (আইটেম) দ্বারা গঠিত, তাই এখানে এটি হয় না এবং আপনার তথ্যটি স্বাভাবিক করা উচিত।

... যদি আমি "ব্যক্তি" এ স্বতন্ত্রভাবে এই কাজগুলি সংরক্ষণ করি তবে আমার কয়েক ডজন ডামি "টাস্কআইডি" কলাম থাকতে হবে ...

না। আপনার কাছে ব্যক্তি এবং টাস্কের মধ্যে একটি ছেদ ছকে (ওরফে দুর্বল সত্তা) কয়েকটি সারি থাকবে । প্রচুর সারি নিয়ে কাজ করার ক্ষেত্রে ডাটাবেসগুলি সত্যই ভাল; এগুলি আসলে প্রচুর [পুনরাবৃত্ত] কলামগুলির সাথে কাজ করার ক্ষেত্রে বেশ জঞ্জাল।

হোসিসনেম দিয়ে দেওয়া দুর্দান্ত পরিষ্কার উদাহরণ example


4
বাস্তব জীবন ব্যবস্থা তৈরি করার সময় "কখনই বলবেন না" বেঁচে থাকার একটি খুব ভাল নিয়ম।
l0b0

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

4

এটি নির্দিষ্ট প্রাক-গণনা করা ক্ষেত্রগুলিতে বৈধ হতে পারে।

যদি আপনার কিছু প্রশ্নের ব্যয়বহুল হয় এবং আপনি ডাটাবেস ট্রিগার ব্যবহার করে স্বয়ংক্রিয়ভাবে আপডেট করা প্রাক-গণনা করা ক্ষেত্রগুলি নিয়ে যাওয়ার সিদ্ধান্ত নিয়ে থাকেন তবে তালিকাগুলি একটি কলামের মধ্যে রাখা বৈধ হতে পারে।

উদাহরণস্বরূপ, ইউআইতে আপনি গ্রিড ভিউ ব্যবহার করে এই তালিকাটি প্রদর্শন করতে চান, যেখানে প্রতিটি সারি ডাবল-ক্লিকের পরে সম্পূর্ণ বিবরণ (সম্পূর্ণ তালিকা সহ) খুলতে পারে:

REGISTERED USER LIST
+------------------+----------------------------------------------------+
|Name              |Top 3 most visited tags                             |
+==================+====================================================+
|Peter             |Design, Fitness, Gifts                              |
+------------------+----------------------------------------------------+
|Lucy              |Fashion, Gifts, Lifestyle                           |
+------------------+----------------------------------------------------+

ক্লায়েন্ট যখন নতুন নিবন্ধ বা তফসিলযুক্ত কার্যের দ্বারা দেখার জন্য আপনি ট্রিগার দ্বারা দ্বিতীয় কলামটি আপডেট করে রাখছেন।

আপনি এমনকি অনুসন্ধানের জন্য (সাধারণ পাঠ্য হিসাবে) এমন ক্ষেত্রটি উপলভ্য করতে পারেন।

এই জাতীয় ক্ষেত্রে তালিকাগুলি রাখা বৈধ। আপনাকে সম্ভবত সর্বোচ্চ ক্ষেত্রের দৈর্ঘ্য অতিক্রম করার ক্ষেত্রে বিবেচনা করা উচিত।


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

তবে আপনি সর্বদা অন্যান্য উত্তরগুলিতে প্রদর্শিত স্ট্যান্ডার্ড নরমালাইজড ফর্মটিতে ফিরে যেতে পারেন।


সংক্ষিপ্তসার: ডাটাবেসের সাধারণ ফর্মগুলি ডেটা মডেলিংয়ের গুরুত্বপূর্ণ দিকগুলি বোঝার জন্য প্রয়োজনীয় তাত্ত্বিক মডেল। তবে অবশ্যই স্বাভাবিকীকরণ কার্য সম্পাদন বা ডেটা পুনরুদ্ধারের অন্যান্য ব্যয় গ্রহণ করে না। এটি তাত্ত্বিক মডেলের সুযোগের বাইরে। তবে তালিকাগুলি সংরক্ষণ করা বা অন্যান্য প্রাক-গণিত (এবং নিয়ন্ত্রিত) সদৃশগুলি প্রায়শই ব্যবহারিক প্রয়োগের দ্বারা প্রয়োজন হয়।

উপরের আলোকে, ব্যবহারিক প্রয়োগের ক্ষেত্রে, আমরা কি নিখুঁত স্বাভাবিক ফর্মের উপর নির্ভরশীল কোয়েরিটি পছন্দ করব এবং 20 সেকেন্ড বা চলমান প্রাক-গণিত মানগুলির উপর নির্ভরশীল সমমানের ক্যোয়ারী যা 0.08 এস লাগে? কেউই তাদের সফ্টওয়্যার পণ্যটিকে আলস্যতার অভিযোগে অভিযুক্ত করতে পছন্দ করে না।


1
এটি পূর্বনির্ধারিত স্টাফ ছাড়াই বৈধ হতে পারে। আমি এটি বেশ কয়েকবার করেছি যেখানে ডেটা সঠিকভাবে সংরক্ষণ করা হয় তবে কার্য সম্পাদনের কারণে মূল রেকর্ডে কয়েকটি ক্যাশেড ফলাফল পূরণ করা কার্যকর।
লোরেন পেচটেল

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

@ লরেনপেকটেল আসলে, এটি এখনও একটি খারাপ কারণ হতে পারে ... ক্যাশে ডেটা একটি মধ্যবর্তী ক্যাশে স্টোরে রাখা উচিত এবং ক্যাশেটি এখনও বৈধ থাকাকালীন, এই কোয়েরিটি কখনই মূল ডিবিতে আঘাত করা উচিত নয়।
তেজরা

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

0

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

CREATE TABLE dbo.PersonToTask (
    pttID INT IDENTITY(1,1) NOT NULL,
    PersonID INT NULL,
    TaskID   INT NULL
)

CREATE PROCEDURE dbo.Task_Assigned (@PersonID INT, @TaskID INT)
AS
BEGIN
    INSERT PersonToTask (PersonID, TaskID)
    VALUES (@PersonID, @TaskID)
END

CREATE PROCEDURE dbo.Task_Deleted (@TaskID INT)
AS
BEGIN
    DELETE PersonToTask  WHERE TaskID = @TaskID
    DELETE Task          WHERE TaskID = @TaskID
END

কীভাবে একটি সাধারণ প্রতিবেদন বা কারা সবাই একটি কার্যভারে নিযুক্ত করা হয়েছে?

CREATE PROCEDURE dbo.Task_CurrentAssigned (@TaskID INT)
AS
BEGIN
    SELECT PersonName
    FROM   dbo.Person
    WHERE  PersonID IN (SELECT PersonID FROM dbo.PersonToTask WHERE TaskID = @TaskID)
END

আপনি অবশ্যই আরও অনেক কিছু করতে পারেন; আপনি যদি টাস্কাসাইনড এবং টাস্কমুক্তের জন্য ডেটটাইম ক্ষেত্রগুলি যুক্ত করেন তবে একটি টাইমরেপোর্ট করা যেতে পারে। এটা সম্পূর্ণ তোমার উপর নির্ভর করছে


0

যদি আপনার কাছে মানব পাঠযোগ্য প্রাথমিক কী থাকে এবং কোনও টেবিলের কাঠামোর উল্লম্ব প্রকৃতির সাথে মোকাবিলা না করেই # কার্যের একটি তালিকা চাইলে এটি কাজ করতে পারে। অর্থাত্ প্রথম টেবিলটি পড়তে অনেক সহজ।

------------------------  
Employee Name | Task 
Jack          |  1,2,5
Jill          |  4,6,7
------------------------

------------------------  
Employee Name | Task 
Jack          |  1
Jack          |  2
Jack          |  5
Jill          |  4
Jill          |  6
Jill          |  7
------------------------

তারপরে প্রশ্নটি হবে: কাজের তালিকাকে কি চাহিদা অনুসারে সংরক্ষণ করা বা উত্পন্ন করা উচিত, যা মূলত প্রয়োজনীয়তার উপর নির্ভর করে যেমন: তালিকার কতবার প্রয়োজন হয়, কতটা ডাটা সারি থাকে তা কতটা সঠিক, ডেটা কীভাবে ব্যবহৃত হবে ইত্যাদি ইত্যাদি on .. তারপরে ব্যবহারকারীর অভিজ্ঞতার সাথে ট্রেড অফগুলি বিশ্লেষণ করে প্রয়োজনীয়তাগুলি পূরণ করা উচিত।

উদাহরণস্বরূপ, সময়ের তুলনা করতে 2 সারি বনাম একটি ক্যোয়ারী চালানো যা 2 সারি উত্পন্ন করে rec যদি এটি দীর্ঘ সময় নেয় এবং ব্যবহারকারীর সর্বাধিক আপ টু ডেট তালিকার প্রয়োজন না হয় (* প্রতিদিন 1 টিরও কম পরিবর্তনের প্রত্যাশা) তবে এটি সঞ্চয় করা যেতে পারে।

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


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

0

আপনি অন্য টেবিলটি কী হওয়া উচিত তা নিয়ে যাচ্ছেন, এটিকে 90 ডিগ্রি দিয়ে সরিয়ে দিয়ে অন্য টেবিলে জুতো দিয়েছিলেন oe

এটি এমন একটি অর্ডার সারণী থাকার মতো যেখানে আপনার আইটেমপ্রডকোড 1, আইটেমকোয়েন্টিটি 1, আইটেমপ্রাইস 1 ... আইটেমপ্রডকোড 37, আইটেমকন্টিটি 37, আইটেমপ্রিস 37 রয়েছে। প্রোগ্রামিক্যালি হ্যান্ডেল করার জন্য বিশ্রী হওয়া ছাড়াও আপনি গ্যারান্টি দিতে পারবেন যে আগামীকাল কেউ 38 টি জিনিস অর্ডার করতে চাইবে।

আমি কেবল তখনই এটি করতে পারি যদি 'তালিকা' সত্যই কোনও তালিকা না থাকে, যেমন এটি সম্পূর্ণরূপে দাঁড়িয়ে থাকে এবং প্রতিটি স্বতন্ত্র লাইনের আইটেমটি কিছু পরিষ্কার এবং স্বতন্ত্র সত্তাকে নির্দেশ না করে। সেক্ষেত্রে কেবলমাত্র এটি যথেষ্ট পরিমাণে কিছু ডেটা টাইপ করুন।

সুতরাং একটি আদেশ একটি তালিকা, উপাদানগুলির একটি বিল হল একটি তালিকা (বা তালিকার একটি তালিকা, যা "পাশের রাস্তা" বাস্তবায়নের জন্য দুঃস্বপ্নের চেয়েও বেশি কিছু হবে)। তবে একটি নোট / মন্তব্য এবং একটি কবিতা নয় are


0

যদি এটি "ঠিক আছে না" তবে এটি মোটামুটি খারাপ যে প্রতিটা ওয়ার্ডপ্রেস সাইটের একক সারিতে wp_capables সহ wp_usermeta এর তালিকা রয়েছে, এক সারিতে বরখাস্ত_ইউপি_পয়েন্টার তালিকা এবং অন্যরা ...

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

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