কীভাবে আন্তর্জাতিক ডাটাবেসের জন্য একটি কোলেশন চয়ন করতে?


22

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

SELECT a < b COLLATE "de_DE" FROM test1;

এই জাতীয় আন্তর্জাতিক ডেটা নিয়ে কাজ করার সঠিক উপায় বলে ধরে নেওয়া, এটি নিজেই ডাটাবেসের জন্য সবচেয়ে ভাল কোলেশন? পোস্টগ্রাইএসকিউএল ডকুমেন্টেশন বলেছেন :

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

আমি মনে করি এটি এই ক্ষেত্রে সেরা পছন্দ, বা আমি ভুল?

(বোনাস প্রশ্ন: কোয়েরিতে নিজেই কোলেশন নির্বাচন করা খুব ধীর?)।


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

2
কোনও উত্স উদ্ধৃত করার সময়, একটি লিঙ্ক যুক্ত করুন।
এরউইন ব্র্যান্ডস্টেটার

উত্তর:


27

Cকোলেশন ডান পছন্দ।

লোকেল ছাড়াই কিছুটা দ্রুত। এবং যেহেতু কোনও কোলেশন ঠিক নেই, কোলেশন ছাড়াই ডাটাবেস তৈরি করুন , যার অর্থ C

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

সচেতন থাকুন যে পোস্টগ্র্রেস অন্তর্নিহিত ওএস দ্বারা সরবরাহিত লোকেল সেটিংসে তৈরি করে, তাই আপনার প্রতিটি লোকেল ব্যবহারের জন্য লোকেল তৈরি করা দরকার। এখানে এবং এখানে এসও সম্পর্কিত সম্পর্কিত আরও উত্তর ।

তবে @Craig ইতিমধ্যে উল্লিখিত , ইনডেক্স এই দৃশ্যকল্প মধ্যে বোতলের হয়। সূচকের কোলেশন প্রয়োগযুক্ত অপারেটরের কোলেশনের সাথে মিলিত হতে পারে এমন অনেক ক্ষেত্রে চরিত্রের ডেটা জড়িত।

COLLATEমিলের সূচকগুলি তৈরি করতে আপনি সূচকগুলিতে স্পেসিফায়ার ব্যবহার করতে পারেন । আপনি যদি একই টেবিলে ডেটা মিশ্রণ করেন তবে আংশিক সূচকগুলি উপযুক্ত পছন্দ হতে পারে।

উদাহরণস্বরূপ, আন্তর্জাতিক স্ট্রিং সহ একটি টেবিল:

CREATE TABLE string (
   string_id serial
  ,lang_id   int NOT NULL
  ,string    text NOT NULL
);

এবং আপনি একবারে একটি ভাষায় বেশিরভাগ আগ্রহী:

SELECT *
FROM   string
WHERE  lang_id = 5  -- 5 being German / Germany here
AND    string > 'foo' COLLATE "de_DE"
ORDER  BY string COLLATE "de_DE";

তারপরে আংশিক সূচকগুলি তৈরি করুন:

CREATE INDEX string_string_lang_id_idx ON string (string COLLATE "de_DE")
WHERE lang_id = 5;

আপনার প্রয়োজন প্রতিটি ভাষার জন্য একটি।

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


1
আপনি কি কোনও নতুন ডাটাবেসের জন্য ডিফল্টরূপে সি লোকেল (বা 'অ-লোকাল' সুনির্দিষ্ট হওয়ার জন্য) ব্যবহার করেন?
জ্যাক ডগলাস

1
@ জ্যাকডুগলাস: না, আমি কেবল বিশেষ ক্ষেত্রে এটি করব do সাধারণত এটি জায়গায় সাধারণত ব্যবহৃত লোকেলের সাথে কাজ করা অনেক বেশি ব্যবহারিক।
এরউইন ব্র্যান্ডসটেটার

13

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

আমি মনে করি না সি লোকেল ব্যবহার করা ভাল ধারণা, কারণ তখন আপনার আবেদনের ডিফল্ট আচরণটি অকেজো হয়ে যাবে। এবং আপনি কেস রূপান্তর ক্রিয়াকলাপ থেকে সঠিক আচরণ নাও পেতে পারেন।

(কোয়েশনে কোলেশনে ওভাররাইড করাতে খুব বেশি ওভারহেড থাকে না It's এটি কেবল একটি পার্স-টাইম অপারেশন))


বুদ্ধিমান ডিফল্ট হওয়ার সম্ভবত কম ব্যথা হতে পারে ..
এরউইন ব্র্যান্ডসেটেটার

1
বর্তমানে আমি পরীক্ষার ডাটাবেসে es_CL.utf8 ব্যবহার করছি তবে আপনার উত্তরের জন্য ধন্যবাদ আমি আরও খানিকটা বেশি দেখেছি এবং এটি খুঁজে পাওয়ার utf8_unicode_ciউপায়
তায়ে

0

আমরা একটি ডকার পাত্রে পোস্টগ্রিস ব্যবহার করি, সুতরাং আমাদের কাছে সর্বদা আইসিইউ উপলব্ধ থাকে এবং und-x-icuএটি ডিফল্ট হিসাবে ব্যবহার করি ।

এটি ২৩.২.২.২.২ অধ্যায়ে উল্লেখ করা হয়েছে পোস্ট্রেস ডক্সের আইসিইউ কোলেশন উল্লেখ করেছে:

und-x-icu ("অপরিজ্ঞাত" জন্য)
আইসিইউ "রুট" কোলেশন। একটি যুক্তিসঙ্গত ভাষা-অজ্ঞাত বাছাইয়ের আদেশ পেতে এটি ব্যবহার করুন।

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