স্টার স্কিমা ডেটা গুদামে গতিশীল ক্ষেত্রগুলির জন্য EAV এর বিকল্প


13

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

যেমন http://example.com/?action=test&foo=abc&bar=def...

আমাকে সমস্ত field => valueম্যাপিংস সঞ্চয় করতে হবে , অর্থাত্ (action => test), (foo => abc), (bar => def), এবং ক্ষেত্রটি যেহেতু গতিশীল তাই একমাত্র সমাধান হ'ল সত্ত্বা-গুণাবলী-মানটি ব্যবহার করা, তবে, লোকেরা বলে যে এটি খুব খারাপ নকশা।

সুতরাং, উপরে আমার ব্যবহারের ক্ষেত্রে বিবেচনা করুন, EAV এর উপযুক্ত বিকল্প কী হবে?

আমার বর্তমান স্কিমা কেএভি ব্যবহার করে

  1. টেবিল requests
    (id, timestamp, uri)
    উদা(1, 149382220, '/')

  2. টেবিল params
    (request_id, key, value)
    উদা(1, 'action', 'test'), (1, 'foo', 'abc'), (1, 'bar', 'def')

কোন পরামর্শ?

আপডেট: আমরা এডাব্লুএস রেডশিফটে গুদাম পরিচালনা করি


2
আপনি ডেভ ডাটাবেসে যা পরামর্শ দিচ্ছেন তা চেষ্টা করে কী হয়েছে? এছাড়াও, আপনি এসকিউএল সার্ভার সম্পর্কে কথা বলছেন? SQL ট্যাগ বেশ বিস্তৃত হয়।
ম্যাক্স ভার্নন

আমার প্রশ্ন আপডেট করেছে
হাওয়ার্ড

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

1
আপনি কী আরডিবিএমএস ব্যবহার করছেন? SQLযথেষ্ট নির্দিষ্ট নয়। আপনাকে দু'বার জিজ্ঞাসা করা হয়েছে। আমি তৃতীয়।
এরউইন ব্র্যান্ডস্টেটর

2
যেহেতু রেডশিফ্ট পোস্টগ্রিএসকিউএল-এর উপর ভিত্তি করে, আমি hstoreবা jsonডেটাটাইপগুলি ব্যবহার করার চেষ্টা করব (বা jsonbযদি / যখন তারা 9.4-এ উন্নীত হয় )।
কলিন টি হার্ট

উত্তর:


11

আমি তিনটি সমাধান - EAV, XML এবং স্পার্স কলামগুলি সম্পর্কে ভাবতে পারি। পরেরটি বিক্রেতা-নির্দিষ্ট এবং আপনার পক্ষে কার্যকর নাও হতে পারে।

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

EAV বিবেচনা

EAV / KVS, যেমন আপনি এটি উপরে বর্ণনা করেছেন, সম্ভবত সবচেয়ে সরল বাস্তবায়ন হতে পারে।

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

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

এক্সএমএল

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

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

এটি দক্ষ কিনা তা আপনার আরডিবিএমএস বিক্রেতা এবং আপনার প্রয়োগের উপর অনেক বেশি নির্ভর করবে।

সবচেয়ে বড় ক্ষয়ক্ষতিটি হ'ল সম্ভবত এটিই ডেটা পরিচালনার একমাত্র উপায় যা মূল অনুরোধটির স্ট্রিং ম্যানিপুলেশনের চেয়ে জটিল!

স্পার্স কলাম / traditionalতিহ্যবাহী সারণী

এটি সম্ভব যে আপনি প্রতিটি কীটিতে একটি কলাম সহ dataতিহ্যগত টেবিল কাঠামোতে আপনার ডেটা লোড করতে পারতেন।

এসকিউএল সার্ভারের স্পার্স কলামগুলি বৈশিষ্ট্যটি একটি ইএভি স্টোরের দুর্দান্ত বিকল্প। স্পার্স কলামগুলির সাথে একটি সারণী একটি সাধারণ টেবিলের মতোই একই রকম আচরণ করে, এটির চেয়ে 30,000 কলাম পর্যন্ত থাকতে পারে, এবং বিরল কলামগুলিতে ন্যূনু মানগুলি সারণীতে কোনও স্থান গ্রহণ করে না।

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

অন্যান্য বিক্রেতাদের সাথে একটি traditionalতিহ্যবাহী টেবিল ব্যবহার করা व्यवहार্য হতে পারে - আইবিএম প্রতি টেবিলে 700 টিরও বেশি কলাম এবং ওরাকলকে প্রায় 1000 সমর্থন করে এবং সংক্ষেপণ বা ওরাকল এর চিকিত্সার নালগুলির চিকিত্সার মতো বৈশিষ্ট্যগুলির অর্থ এই হতে পারে যে আপনি আপনার এপিআই ডেটা মোটামুটি দক্ষতার সাথে সঞ্চয় করতে পারেন।

এই পদ্ধতির সুস্পষ্ট নেতিবাচকতা হ'ল আপনি আপনার এপিআইতে নতুন কী যুক্ত করার সাথে সাথে আপনার স্কিমাকে সেই অনুযায়ী সামঞ্জস্য করতে হবে।


2
পোস্টগ্র্যাসকিউএল-এ আমি এক্সএমএল এর সুপারিশ করব না তবে হয় hstoreবা হয় json। আসন্ন 9.4 jsonbআমার প্রস্তাবনা হবে।
কলিন টি হার্ট

আমি প্রতিটি উত্তর উপকারিতা এবং ব্যাখ্যা সহ সত্যিই এই উত্তর পছন্দ। অত্যন্ত তথ্যবহুল - স্পার্স কলামের তথ্যের আমি অবশ্যই প্রশংসা করি। আমি স্পার্স কলাম পদ্ধতির ব্যবহার করে EAV এর একটি উদাহরণ চাই।
স্টিক্সো

9

EAV একটি খারাপ নকশা নয়, তবে, এটি কেবলমাত্র এমন একটি নকশা যা যথেষ্ট পরিমাণে পূর্বাভাসের প্রয়োজন হয় এবং ডেটার পরিমাণ বাড়ার সাথে সাথে পারফরম্যান্সের সমস্যাগুলিও তৈরি করা যায়। এটি হতে পারে যে আপনার সিস্টেমের জন্য, এটি ভালভাবে কাজ করবে।

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

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

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


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

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