সমস্যা
দ্রষ্টব্য: আমি গাণিতিক ক্রমগুলি উল্লেখ করি , পোস্টগ্রেএসকিউএল এর সিকোয়েন্সগুলি নয় ।
আমার কাছে পূর্ণসংখ্যার ক্রমিক প্রতিনিধিত্বকারী একটি টেবিল রয়েছে। সংজ্ঞাটি হ'ল:
CREATE TABLE sequences
(
id serial NOT NULL,
title character varying(255) NOT NULL,
date date NOT NULL,
sequence integer[] NOT NULL,
CONSTRAINT "PRIM_KEY_SEQUENCES" PRIMARY KEY (id)
);
আমার লক্ষ্য একটি প্রদত্ত অনুচ্ছেদ ব্যবহার করে সারি সন্ধান করা। এটি বলতে গেলে, sequence
ক্ষেত্রটি যে সারিগুলিতে একটি অনুক্রম থাকে তাতে প্রদত্ত অনুচ্ছেদ থাকে (আমার ক্ষেত্রে, সিকোয়েন্সটি অর্ডার করা হয়)।
উদাহরণ
ধরুন সারণীতে নিম্নলিখিত তথ্য রয়েছে:
+----+-------+------------+-------------------------------+
| id | title | date | sequence |
+----+-------+------------+-------------------------------+
| 1 | BG703 | 2004-12-24 | {1,3,17,25,377,424,242,1234} |
| 2 | BG256 | 2005-05-11 | {5,7,12,742,225,547,2142,223} |
| 3 | BD404 | 2004-10-13 | {3,4,12,5698,526} |
| 4 | BK956 | 2004-08-17 | {12,4,3,17,25,377,456,25} |
+----+-------+------------+-------------------------------+
সুতরাং প্রদত্ত অনুচ্ছেদটি যদি হয় তবে {12, 742, 225, 547}
আমি সারি 2 সন্ধান করতে চাই।
একইভাবে, প্রদত্ত অনুচ্ছেদটি যদি হয় তবে {3, 17, 25, 377}
আমি সারি 1 এবং সারি 4 সন্ধান করতে চাই।
শেষ অবধি, যদি প্রদত্ত অনুচ্ছেদটি হয় {12, 4, 3, 25, 377}
, তবে কোনও সারি ফিরে আসে না।
তদন্ত
প্রথমত, আমি সম্পূর্ণরূপে নিশ্চিত নই যে অ্যারের ডেটা টাইপের সাথে সিকোয়েন্সগুলি প্রতিনিধিত্ব করা বুদ্ধিমান। যদিও এটি পরিস্থিতিটিকে উপযুক্ত বলে মনে হয়; আমি আশঙ্কা করি যে এটি আরও জটিল পরিচালনা করে। অন্য টেবিলে সম্পর্কের মডেল ব্যবহার করে, সিকোয়েন্সগুলি আলাদাভাবে উপস্থাপন করা আরও ভাল।
একইভাবে, আমি unnest
অ্যারের ফাংশনটি ব্যবহার করে ক্রমগুলি প্রসারিত করার বিষয়ে ভাবি এবং তারপরে আমার অনুসন্ধানের মানদণ্ডটি যুক্ত করি। তবুও, অনুক্রমের শর্তগুলির সংখ্যাটি পরিবর্তনশীল হওয়ার কারণে আমি এটি দেখতে পারি না do
আমি জানি যে ইনটারে মডিউলটির subarray
ক্রিয়াকলাপটি ব্যবহার করে আমার সিকোয়েন্সটি কাটাও সম্ভব তবে এটি আমার অনুসন্ধানের জন্য কীভাবে আমাকে উপকৃত করবে তা আমি দেখতে পাচ্ছি না।
সীমাবদ্ধতাসমূহ
এমনকি যদি এই মুহুর্তে আমার মডেলটি এখনও বিকাশ করা হচ্ছে তবে টেবিলটি 50,000 থেকে 300,000 সারিগুলির মধ্যে অনেকগুলি সিকোয়েন্সের সমন্বয়ে গঠিত। সুতরাং আমি একটি শক্তিশালী পারফরম্যান্স বাধা আছে।
আমার উদাহরণে আমি তুলনামূলকভাবে ছোট পূর্ণসংখ্যার ব্যবহার করেছি। অনুশীলনে, এটি সম্ভব যে এই পূর্ণসংখ্যাগুলি অনেক বেশি বড় হয়ে ওভারফ্লো হয়ে যায় bigint
। এই পরিস্থিতিতে, আমি মনে করি স্ট্রিং হিসাবে সংখ্যা সংরক্ষণ করা সবচেয়ে ভাল (যেহেতু গাণিতিক ক্রিয়াকলাপগুলির এই ক্রমগুলি সম্পাদন করা প্রয়োজন হয় না)। যাইহোক, এই সমাধানটি বেছে নেওয়া, এটি উপরে বর্ণিত ইনটারের মডিউলটি ব্যবহার করা অসম্ভব করে তোলে ।
numeric
স্ট্রিং ব্যবহার করবেন না ( text
উদাহরণস্বরূপ)? আমার ক্রমগুলিতে গাণিতিক ক্রিয়াকলাপ করার দরকার নেই perform
text
এবং এটি আপনাকে বোগাস অ-সংখ্যাগত ডেটা সংরক্ষণ করতে বাধা দেয়। নির্ভর করে, আপনি কেবলমাত্র I / O করছেন যদি আপনি পাঠ্য I / O প্রসেসিং হ্রাস করতে পারে।
SELECT ARRAY[12, 4, 3, 17, 25, 377, 456, 25] @> ARRAY[12, 4, 3, 25, 377];
সত্য ফিরে আসবে, কারণ এই অপারেটর দ্বারা অর্ডার বিবেচনা করা হয় না।
bigint
ব্যবহারnumeric
করা উচিত । এটি অনেক ধীর এবং যদিও আরও বেশি জায়গা নেয়।