কী মানগুলির এই ডাটাবেস স্কিমার জন্য কোনও নাম আছে?


68

আমরা একজন ক্লায়েন্টের থেকে একটি রুটিন ডেটা ফিড প্রক্রিয়া করি যিনি কেবলমাত্র তাদের পরিচিতি (এমন এক সারি প্রতি সত্ত্বা, প্রতি কলামের প্রতিটি কলাম) বলে মনে হয় এমন একটি ফর্ম থেকে তাদের ডাটাবেসটিকে পুনরায় সঞ্চারিত করেছেন (বৈশিষ্ট্যের প্রতি সত্তায় এক সারি):

আগে: বৈশিষ্ট্য অনুসারে একটি কলাম

ID   Ht_cm   wt_kg   Age_yr  ... 
1      190      82     43    ...
2      170      60     22    ...
3      205      90     51    ...

পরে: সমস্ত বৈশিষ্ট্যের জন্য একটি কলাম

ID    Metric   Value
 1     Ht_cm     190
 1     Wt_kg     82
 1     Age_yr    43
 1      ...
 2     Ht_cm     170
 2     Wt_kg     60
 2     Age_yr    22
 2     ...
 3     Ht_cm     205
 3     Wt_kg     90
 3     Age_yr    51
 3     ...

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

উত্তর:


91

এটিকে সত্তা-গুণ-মান (কখনও কখনও 'নাম-মান জোড়া') বলা হয় এবং লোকেরা যখন একটি সম্পর্কিত ডেটাবেসে EAV প্যাটার্ন ব্যবহার করে তখন এটি "একটি বর্গক্ষেত্রের একটি গোল প্যাগ" এর একটি ক্লাসিক কেস।

আপনি কেন EAV ব্যবহার করবেন না তার একটি তালিকা এখানে রয়েছে :

  • আপনি ডেটা ধরণের ব্যবহার করতে পারবেন না। মানটি একটি তারিখ, সংখ্যা বা অর্থ (দশমিক) হয় কিনা তা বিবেচ্য নয়। এটি সর্বদা ভারচরে জোর করে চলেছে। এটি একটি ছোটখাটো পারফরম্যান্স সমস্যা থেকে শুরু করে বিশাল অন্ত্র-ব্যথার মতো কিছু হতে পারে (মাসিক রোল-আপ রিপোর্টে কখনও এক শতাংশের প্রকরণকে তাড়া করতে হয়েছিল?)।
  • আপনি (সহজেই) সীমাবদ্ধতা প্রয়োগ করতে পারবেন না। "প্রত্যেকের উচ্চতা 0 থেকে 3 মিটারের মধ্যে হওয়া দরকার" বা "বয়স অবশ্যই শূন্য এবং> = 0" না হওয়াতে এই হাস্যকর পরিমাণের কোডের প্রয়োজন হয়, এই প্রতিবন্ধকতাগুলির প্রতিটিই 1-2 টি লাইনের বিপরীতে হবে সঠিকভাবে মডেলিং সিস্টেমে
  • উপরের সাথে সম্পর্কিত, আপনি সহজেই গ্যারান্টি দিতে পারবেন না যে আপনি প্রতিটি ক্লায়েন্টের জন্য আপনার প্রয়োজনীয় তথ্য পেয়েছেন (বয়স একের থেকে হারিয়ে যেতে পারে, তার পরেরটির দৈর্ঘ্য তাদের অনুপস্থিত হতে পারে ইত্যাদি)। আপনি এটি করতে পারেন, তবে এটি এর চেয়ে অনেক বেশি কঠিন একটি জাহান্নাম SELECT height, weight, age FROM Client where height is null or weight is null
  • আবার সম্পর্কিত, ডুপ্লিকেট ডেটা সনাক্ত করা খুব কঠিন (যদি তারা আপনাকে একটি ক্লায়েন্টের জন্য দুটি বয়স দেয় তবে কি হবে? নীচের হিসাবে ডেটা-ইএভিভিং, যদি আপনার একটি বৈশিষ্ট্য দ্বিগুণ হয় তবে আপনাকে দুটি সারি ফলাফল দেবে one এক ক্লায়েন্ট যদি দুটি বৈশিষ্ট্যের জন্য দুটি পৃথক এন্ট্রি রয়েছে, আপনি নীচের প্রশ্নের থেকে চারটি সারি পাবেন )।
  • আপনি এমনকি গ্যারান্টি দিতে পারবেন না যে বৈশিষ্ট্যের নামগুলি সামঞ্জস্যপূর্ণ। "এজ_ইয়ার" "এজিE_১০ ইয়ার্স" বা "বয়স" হতে পারে। (স্বীকার করুন যে আপনি যখন কোনও ডেটা serোকাচ্ছেন তখন বনাম কোনও এক্সট্র্যাক্ট গ্রহণ করার সময় এটি কোনও সমস্যার কম নয়))
  • যে কোনও ধরণের অনিয়ন্ত্রিত ক্যোয়ারী সম্পূর্ণ বিপর্যয়। একটি ত্রি-গুণযুক্ত EAV সিস্টেমের সাথে সম্পর্কিত করতে যাতে আপনি এটি যুক্তিযুক্ত ফ্যাশনে জিজ্ঞাসা করতে পারেন EAV টেবিলের তিনটি সংযুক্ত হওয়া প্রয়োজন।

তুলনা করা:

SELECT cID.ID AS [ID], cH.Value AS [Height], cW.Value AS [Weight], cA.Value AS [Age]
FROM (SELECT DISTINCT ID FROM Client) cID 
      LEFT OUTER JOIN 
    Client cW ON cID.ID = cW.ID AND cW.Metric = "Wt_kg" 
      LEFT OUTER JOIN 
    Client cH ON cID.ID = cH.ID AND cW.Metric = "Ht_cm" 
      LEFT OUTER JOIN 
    Client cA ON cID.ID = cA.ID AND cW.Metric = "Age_yr"

প্রতি:

SELECT c.ID, c.Ht_cm, c.Wt_kg, c.Age_yr
FROM Client c

আপনার কখন ইএভি ব্যবহার করা উচিত তার একটি (খুব সংক্ষিপ্ত) তালিকা এখানে রয়েছে:

  • যখন সেখানে একেবারে বাইরে কোন পথ এবং আপনি আপনার ডাটাবেসের মধ্যে স্কিমা-কম ডেটা সমর্থন করার জন্য আছে।
  • যখন আপনার কেবল "স্টাফ" সংরক্ষণ করা দরকার এবং এটি আরও কাঠামোগত আকারে লাগবে বলে আশা করবেন না। সাবধান, যদিও, দানবটি "পরিবর্তনের প্রয়োজনীয়তা" বলে।

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


7
একটি সামান্য নোটিশ সহ +1: আপনি যদি বিভিন্ন টেবিলগুলিতে বিভিন্ন ধরণের মান রাখেন তবে আপনি ডেটা প্রকারগুলি ব্যবহার করতে পারেন (ভাল, ক্লাসিক EAV নয়, তবে উন্নতি বাছাই করুন)। (তবে তারপরে একটি অতিরিক্ত প্রশ্ন আসে: নতুন বৈশিষ্ট্যের
ধরণটি আপনি কীভাবে জানবেন

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

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

2
@ জোয়েলব্রাউন আমি এটির দ্বিমত পোষণ করছি না যে এটির (খুব ছোট খুব সরু) ব্যবহার রয়েছে। তবে তথ্যটি যদি কোনও কাঠামোগত ফ্যাশনে জিজ্ঞাসা করা হয় তবে সম্ভবত এটি ইএভিতে হওয়া উচিত নয়
জেএনকে

4
@ জোয়েলব্রাউন আপনার ব্যবসায়ের প্রয়োজনীয়তা বা আপনি যে ডেটা পরিবর্তন করছেন তা যদি আপনার ডেটা মডেল হয় । আপনার ডেটা মডেলটি পাথরে খোদাই করা উচিত নয়। এছাড়াও, একটি সম্পর্কিত ডেটাবেসের জন্য, 99% লোকেরা EAV ব্যবহার করে তাদের যুক্তি ফোটায় যে "আমি কীভাবে জানি আমার সমস্ত ডাটাবেস নিদর্শন এবং মডেল বিবেচনা না করে" "কীভাবে আমার ডেটা সংরক্ষণ করবেন সে সম্পর্কে চিন্তাভাবনা করতে চাই না" to EAV এই ডেটা সেটটির জন্য সবচেয়ে ভাল কাজ করে "। পুনরাবৃত্তি করার জন্য - হয় ক্ষেত্রে যেখানে EAV দরকারী (এবং এমনকি 'অধিকার' উত্তর) হল, কিন্তু তারা কয়েক এবং বিরল করছি।
সাইমন রিঘার্টস

18

সত্তা গুণ মান (EAV)

এটি আমাকে সহ অনেকেই একটি বিরোধী-নিদর্শন হিসাবে বিবেচনা করে।

আপনার বিকল্পগুলি এখানে:

  1. ডাটাবেস টেবিল উত্তরাধিকার ব্যবহার

  2. এক্সএমএল ডেটা এবং এসকিউএলএক্সএমএল ফাংশন ব্যবহার করুন

  3. HBase এর মতো একটি nosql ডাটাবেস ব্যবহার করুন


3
সর্বাধিক ব্যবহারের ক্ষেত্রে অবশ্যই এন্টি-প্যাটার্ন। আপনার যদি সত্যিই একটি ছোট ডেটা সেট থাকে এবং পারফরম্যান্সে কিছু আসে যায় না তবে এটি আপনার পক্ষে কার্যকর হতে পারে।
জেএনকে

16

পোস্টগ্রেএসকিউএল-তে, EAV কাঠামোগুলি মোকাবেলার একটি খুব ভাল উপায় হ'ল অতিরিক্ত মডিউল hstore, সংস্করণ 8.4 বা তার পরে পাওয়া যাবে। আমি ম্যানুয়াল উদ্ধৃত:

এই মডিউলটি hstoreএকক পোস্টগ্রিসএসকিউএল মানের মধ্যে কী / মান জোড়ার সেটগুলি সঞ্চয় করার জন্য ডেটা টাইপ প্রয়োগ করে । এটি বিভিন্ন পরিস্থিতিতে যেমন অনেকগুলি বৈশিষ্ট্যযুক্ত সারি যা খুব কমই পরীক্ষা করা হয়, বা আধা-কাঠামোগত ডেটাতে কার্যকর হতে পারে। কী এবং মানগুলি কেবল পাঠ্য স্ট্রিং।

যেহেতু পোস্টগ্রিস ৯.২ রয়েছে তার সাথে যাওয়ার জন্য jsonটাইপ এবং কার্যকারিতার একটি হোস্টও রয়েছে (এর বেশিরভাগটি 9.3 দিয়ে যুক্ত হয়েছে )।

পোস্টগ্রেস 9.4 jsonbবিকল্পগুলির তালিকায় "বাইনারি জেএসওএন" ডেটা টাইপ যুক্ত করে (বৃহততর উচ্চতর!) উন্নত সূচক অপশন সহ।


10

আপনার যদি এমন একটি ডাটাবেস থাকে যা EAV কাঠামোটি ব্যবহার করে, তবে বিভিন্ন উপায়ে ডেটাটি অনুসন্ধান করা সম্ভব।

@ সাইমন এর উত্তর ইতিমধ্যে দেখায় যে কীভাবে একাধিক যোগদান করে কোন কোয়েরি করা যায়।

নমুনা ডেটা ব্যবহৃত:

CREATE TABLE yourtable ([ID] int, [Metric] varchar(6), [Value] int);

INSERT INTO yourtable ([ID], [Metric], [Value])
VALUES (1, 'Ht_cm', 190),
    (1, 'Wt_kg', 82),
    (1, 'Age_yr', 43),
    (2, 'Ht_cm', 170),
    (2, 'Wt_kg', 60),
    (2, 'Age_yr', 22),
    (3, 'Ht_cm', 205),
    (3, 'Wt_kg', 90),
    (3, 'Age_yr', 51);

আপনি যদি কোনও আরডিবিএমএস ব্যবহার করে যা কোনও PIVOTফাংশন ( এসকিউএল সার্ভার 2005+ / ওরাকল 11 জি + ) থাকে তবে আপনি নিম্নলিখিত উপায়ে ডেটাটি জিজ্ঞাসা করতে পারেন:

select id, Ht_cm, Wt_kg, Age_yr
from
(
  select id, metric, value
  from yourtable
) src
pivot
(
  max(value)
  for metric in (Ht_cm, Wt_kg, Age_yr)
) piv;

ডেমো সহ এসকিউএল ফিডল দেখুন

যদি আপনার কোনও PIVOTফাংশনে অ্যাক্সেস না থাকে তবে আপনি CASEডেটা ফিরিয়ে দিতে একটি বিবৃতি সহ একটি সামগ্রিক ফাংশন ব্যবহার করতে পারেন :

select id,
  max(case when metric ='Ht_cm' then value else null end) Ht_cm,
  max(case when metric ='Wt_kg' then value else null end) Wt_kg,
  max(case when metric ='Age_yr' then value else null end) Age_yr
from yourtable
group by id

ডেমো সহ এসকিউএল ফিডল দেখুন

এই উভয় প্রশ্নেরই ফলাফলের তথ্য ফিরে আসবে:

| ID | HT_CM | WT_KG | AGE_YR |
-------------------------------
|  1 |   190 |    82 |     43 |
|  2 |   170 |    60 |     22 |
|  3 |   205 |    90 |     51 |

10

ইএভি ডিবি মডেলটিকে কীভাবে সমালোচনা করা হয় এবং এমনকি কেউ কেউ "অ্যান্টি-প্যাটার্ন" হিসাবে বিবেচনা করে তা মজার বিষয়।

যতদূর আমি উদ্বিগ্ন, বড় অবক্ষয় হ'ল :

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

যাইহোক, আপনি অবশ্যই এই সমাধানটি বাতিল করবেন না এবং এখানে কেন:

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

2
প্রথম ইএভি ডিজাইনের একটি এনকাউন্টারগুলির জন্য লার্নিং কার্ভ স্টিপার। এরপরে, সবাই একরকম দেখতে লাগবে।
ypercubeᵀᴹ

1
অস্থায়ী মন্তব্য: আমি কেন "রিপোর্টিংয়ের জন্য উপযুক্ত নয়" দাবিটি বুঝতে পারছি না। EAV রিপোর্ট করার জন্য দুর্দান্ত মনে হয়। ইভটিভালিউজ থেকে অবজেক্টআইড নির্বাচন করুন যেখানে সম্পত্তি আইডি = নাম এবং 'এম%' এর মতো মান। ভার্চুয়াল স্কিমা পরিবর্তন (যেমন বৈশিষ্ট্য যুক্ত করা) পুনরায় সংযোগ না করে যে কোনও গতিশীল রিপোর্টিং ইন্টারফেসে (ড্রপডাউনগুলির মতো) অন্তর্ভুক্ত করা যেতে পারে।
ক্রোকসেক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.