লুকআপ টেবিলগুলির যথাযথ ব্যবহার


25

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

ধরা যাক আমার কাছে কর্মচারী নামে একটি টেবিল রয়েছে:

ID  LName   FName   Gender  Position
1   Doe     John    Male    Manager
2   Doe     Jane    Female  Sales
3   Smith   John    Male    Sales

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

ID  Position
1   Manager
2   Sales

তবে আমি আর কতক্ষণ অব্যবহারযোগ্য হওয়ার আগে তথ্যটিকে ছোট ছোট সন্ধানের টেবিলগুলিতে ভাঙতে পারি? আমি একটি জেন্ডার টেবিল তৈরি করতে পারি এবং একটি পৃথক দেখার টেবিলের সাথে পুরুষের সাথে 1 টি এবং মহিলার সাথে 2 টি মিল থাকতে পারে। আমি এমনকি টেবিলে LNames এবং FNames রাখতে পারি। সমস্ত "জন" এন্ট্রিগুলিকে 1 এর বিদেশী কী দিয়ে প্রতিস্থাপন করা হয় যা এফএনমে টেবিলের দিকে নির্দেশ করে যা বলে যে 1 এর একটি আইডি জনকে অনুরূপ করে। আপনি যদি এই খরগোশের গর্তটি খুব বেশি দূরে নীচে যান তবে আপনার কর্মচারীদের টেবিলটি তখন বিদেশী কীগুলির গোলমালে পরিণত হবে:

ID  LName   FName   Gender  Position
1   1       1       1       1
2   1       2       2       2
3   2       1       1       2

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


5
"অনুসন্ধান" সারণী ব্যবহার করা একটি জিনিস। আইডি নম্বর দিয়ে পাঠ্য প্রতিস্থাপন করা সম্পূর্ণ আলাদা জিনিস।
মাইক শেরিল 'ক্যাট রিকল'

1
লিঙ্গ সর্বদা 2 টি মান স্থির করা যায় না! এখন যেহেতু আমাদের লিঙ্গ স্থানান্তর রয়েছে, যিনি বলছেন যে কোনও অ্যাপ্লিকেশনটির জন্য 'জন্মগত পুরুষ এখন মহিলা' বা 'জন্মানো মহিলা এখন পুরুষ' এর মতো অতিরিক্ত বিভাগের প্রয়োজন পড়বে না।

@ মাইক, ভাল মন্তব্য!
ওয়াল্টার মিট্টি

আমার দোকানে চিন্তাবিদরা কেবল পুরুষ, মহিলা, হিজড়া, কেবল চারটি পছন্দ প্রকাশ করার পরে থামাতে সক্ষম হয়েছিল।
কেভিনস্কি

উত্তর:


22

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

আপনি দুটি ভিন্ন ইস্যু মিশ্রিত করছেন। একটি ইস্যু হ'ল "অনুসন্ধান" টেবিলের ব্যবহার; অন্যটি হ'ল সারোগেট কী (আইডি নম্বর) ব্যবহার।

এই টেবিল দিয়ে শুরু করুন।

ID  LName   FName   Gender  Position
1   Doe     John    Male    Manager
2   Doe     Jane    Female  Sales
3   Smith   John    Male    Sales

আপনি এই জাতীয় অবস্থানের জন্য একটি "অনুসন্ধান" সারণী তৈরি করতে পারেন।

create table positions (
  pos_name varchar(10) primary key
);

insert into positions
select distinct position 
from employees;

alter table employees
add constraint emp_fk1
foreign key (position) 
  references positions (pos_name);

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

"অনুসন্ধান" সারণীটি ব্যবহার করে এগুলি ফোটে: আপনার অ্যাপ্লিকেশনটির কী কোনও বিদেশী কী রেফারেন্স সরবরাহ করে এমন ইনপুট মানগুলির নিয়ন্ত্রণের প্রয়োজন? যদি তা হয় তবে আপনি সর্বদা একটি "অনুসন্ধান" সারণীটি ব্যবহার করতে পারেন। (এটি কোনও সারোগেট কী ব্যবহার করে কিনা তা নির্বিশেষে))

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


2
আমি জানতাম না যে আপনি এত কিছু করতে পারবেন! আপনার পদ্ধতিটি যেভাবে কাজ করে তা দারুণ সুন্দর। ধন্যবাদ!
ব্র্যাড টার্নার

4
আমি ডিবিএ স্ট্যাক এক্সচেঞ্জে যোগদান করেছি যাতে আমি এই উত্তরটি আপ করতে পারি। এটি সুন্দর এবং আমার কাছে কখনও ঘটেনি। ধন্যবাদ!
সিন্ডিএইচ

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

8

আপনার কর্মচারী সারণীতে, আমি কেবল "পজিশন" এর জন্য অনুসন্ধান করতে পারি কারণ এটি সীমিতভাবে ডেটা বর্ধিত করতে পারে।

  • লিঙ্গটি স্ব-বর্ণনার (বলা Mবা F), 2 টি মানের মধ্যে সীমাবদ্ধ এবং একটি চেক সীমাবদ্ধতার সাথে প্রয়োগ করা যেতে পারে। আপনি নতুন জেন্ডার যুক্ত করবেন না (রাজনৈতিক নির্ভুলতা বলগুলি উপেক্ষা করে)
  • "জন" প্রথম নামটি কোনও সীমিত, সীমাবদ্ধ তথ্যের সংস্থার অংশ নয়: ডেটাগুলির সম্ভাব্য সেটটি কার্যকরভাবে সীমাহীন বিন্দুতে বিশাল যেহেতু এটির সন্ধান করা উচিত নয় it

আপনি যদি কোনও নতুন অবস্থান যুক্ত করতে চান তবে কেবল সন্ধানের সারণিতে একটি সারি যুক্ত করুন। এটি ডেটা পরিবর্তনের ব্যঙ্গগুলিও সরিয়ে দেয় যা সাধারণীকরণের এক পয়েন্ট

এছাড়াও, একবার আপনার এক মিলিয়ন কর্মচারী থাকলে বারচারের চেয়ে টিনিনেন্ট পজিশনআইডি সংরক্ষণ করা আরও দক্ষ।

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

সুতরাং, সংক্ষেপে বলতে গেলে আপনি সারণী ব্যবহার করেন

  1. যেখানে আপনার একটি কলামে সীমাবদ্ধ, তবুও প্রসারণযোগ্য সেট ডেটা রয়েছে
  2. স্ব বর্ণনা না হয় যেখানে
  3. ডেটা সংশোধন ব্যর্থতা এড়াতে

1
একটি লিখিতভাবে সারণীতে লিঙ্গ স্থাপনের একটি সম্ভাব্য কারণ হ'ল স্থানীয়করণ।
a_horse_with_no_name

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

4
@ অধিবেল: "সেক্স" নামক একটি কলামের সঠিক মান হ'ল হ্যাঁ দয়া করে "। আপনি যদি না করছি ব্রিটিশ
gbn

শব্দটির সাধারণকরণ সম্পর্কিত একটি বিশেষ অর্থ রয়েছে এবং লিঙ্কটি অনুপযুক্ত হওয়ায় এখানে "anomolies" শব্দটির অপব্যবহার করা হচ্ছে।
ফিলিপ্সি

5

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

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

একটি প্রিয় উদ্ধৃতি পুনরায় ব্যবহার করতে

"একজন জ্ঞানী ব্যক্তি একবার আমাকে বলেছিলেন" এটির ব্যথা না হওয়া পর্যন্ত স্বাভাবিক করুন, এটি কাজ না হওয়া পর্যন্ত অস্বীকৃতি দিন "।

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

একটি বাস্তব সিস্টেম থেকে অত্যন্ত স্বাভাবিক টেবিলগুলির সংক্ষিপ্ত উদাহরণটি ধরুন

CREATE TABLE PROPERTY
(ID                          NUMBER(9)           NOT NULL);

CREATE TABLE PROPERTY_TYPE
(ID                          NUMBER(9)           NOT NULL);

CREATE TABLE PROPERTY_LOCALE 
PROPERTY_ID                  NUMBER(9)           NOT NULL,
(LOCALE_ID                   NUMBER(9)           NOT NULL,  --language 
VALUE                        VARCHAR2(200)       NOT NULL);

CREATE TABLE PROPERTY_DEPENDENCY
(PROPERTY_ID                 NUMBER(9)           NOT NULL,
 PARENT_PROPERTY_ID          NUMBER(9)                   ,
 PROPERTY_TYPE_ID            NUMBER(9)           NOT NULL);

এই টেবিলগুলি একক সম্পত্তি এবং পিতামাতার সন্তানের সম্পত্তিগুলির একটি লিঙ্কযুক্ত তালিকা সেট আপ করে এবং সেগুলি এখানে ব্যবহৃত হয়

  CREATE TABLE CASE_PROPERTY
  (ID                        NUMBER(9)           NOT NULL,
  PARENT_ID                  NUMBER(9),
  CASE_ID                    NUMBER(9)           NOT NULL,
  PROPERTY_ID                NUMBER(9),
  PROPERTY_TYPE_ID           NUMBER(9)           NOT NULL);

এটি দুর্দান্ত দেখাচ্ছে: সমস্ত সিলেক্ট করে সম্পত্তি-আইডি দিয়ে একটি নির্বাচন করুন

এর থেকে বাছাই করার জন্য একটি তালিকা পেতে পারি

 Select pl.value, pd.property_id
 from property_locale pl, property_dependency pd
 where pl.property_id = pd.property_id
 and pd.property_type_id = 2;  --example number

এখন কোনও মামলার সমস্ত বৈশিষ্ট্য নির্বাচন করার চেষ্টা করুন যদি এতে 3 এবং 4 এবং 5 এর সম্পত্তি_প্রকার রয়েছে, না ...

SELECT   cp2.case_id,
         (SELECT   pl.VALUE
            FROM   case_property cp, property_locale pl
           WHERE       cp.property_id = pl.property_id
                   AND CP.PROPERTY_TYPE_ID = 2
                   AND pl.locale_id = 2
                   AND cp.case_id = cp2.case_id)
            AS VALUE1,
         (SELECT   pl.VALUE
            FROM   case_property cp, property_locale pl
           WHERE       cp.property_id = pl.property_id
                   AND CP.PROPERTY_TYPE_ID = 34
                   AND pl.locale_id = 2
                   AND cp.case_id = cp2.case_id)
            AS VALUE2,
         (SELECT   pl.VALUE
            FROM   case_property cp, property_locale pl
           WHERE       cp.property_id = pl.property_id
                   AND CP.PROPERTY_TYPE_ID = 4
                   AND pl.locale_id = 2
                   AND cp.case_id = cp2.case_id)
            AS VALUE3
  FROM   case_property cp2
 WHERE   cp2.case_id = 10293  

এটি কেবল ব্যাথা করে ... এমনকি আপনি যখন এটি মোকাবেলার আরও মার্জিত উপায়গুলি ব্যবহার করেন তখনও। যাইহোক, বৈশিষ্ট্যগুলি ভেঙে কিছুটা ডি নরমালাইজেশন যুক্ত করুন যে কোনও মামলায় কেবল একটি সম্পত্তি_আইডি থাকবে এবং এটি আরও ভাল হতে পারে।

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


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