ডাটাবেসে ইউনিট সংরক্ষণের সর্বোত্তম উপায়


21

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

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

আপডেট: @ টড এভারেটের উত্তরটি পড়ার পরে, আমার কাছে একটি সম্ভাব্য সমাধান এসেছে, তাই আমি এগিয়ে গিয়ে নিজের প্রশ্নের উত্তর দিতে যাচ্ছি। (নিচে দেখ)


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

উত্তর:


12

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

UOM Conversion              

UOM From    UOM To        Cal Step  Operator Factor Constant
Kilograms   Pounds        1         *        2.2
Celsius     Fahrenheit    1         *        1.8
Celsius     Fahrenheit    2         +               32

এটি বলে যে কেজি থেকে এলবিতে রূপান্তর করার জন্য প্রথম পদক্ষেপটি কেজি কে ২.২ দিয়ে গুণ করা হয়। একটি ধ্রুবক এছাড়াও আছে যদি কোনও রূপান্তরটিতে অবশ্যই একটি ধ্রুবক মান এবং একাধিক পদক্ষেপ তৈরির ক্ষমতা অন্তর্ভুক্ত থাকে। সুতরাং সেলসিয়াসকে ফারেনহাইটে রূপান্তর করার সময় আপনি সেলসিয়াসকে ১.৮ দিয়ে গুণিত করুন এবং তারপরে ৩২ যোগ করুন। মূলটি হবে ইউওএম থেকে, ইউওএম থেকে এবং গণনা পদক্ষেপ।

এটা আমার 2 সেন্ট মূল্য। আমি আশা করি এই বর্তমান উল্লেখগুলি আপনাকে চিন্তার জন্য কিছু ভাল খাবার দেবে যদি আপনি বর্তমান ডিজাইনে রিবুট করার সুযোগ পান।


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

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

8

সব কাজ.

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

এছাড়াও নোট করুন যে রূপান্তরগুলি খুব নিরাপদ হতে পারে না এবং বৃত্তাকার ত্রুটি, ওভারফ্লোস ইত্যাদির পক্ষে সংবেদনশীল are

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

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

আর একটি বিকল্প হ'ল পৃথক মূল পরিমাপের পাশাপাশি স্থির ইউনিটগুলিতে (যেমন সর্বদা কিলোগ্রাম এবং মিটার) ক্যানোনিকাল সংস্করণ সংরক্ষণ করা। নির্দিষ্ট ইউনিটগুলিতে সমষ্টিগত ক্রিয়াকলাপগুলি সূক্ষ্ম হওয়া উচিত (আপনি উদাহরণস্বরূপ তাপমাত্রা যোগ করবেন না) তবে আপনি মূল পরিমাপটি হারাবেন না।


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

1
কলাম-নাম সমাধানের সম্ভাব্য অপূর্ণতা সম্পর্কে দুর্দান্ত পয়েন্ট।
কিমিওট

1
@ কেমোট এটি কোনও সাধারণ সমস্যা নয় - আমাদের কাছে এমন প্রতিবেদন রয়েছে যেখানে পৃথক লেনদেনের মূল পরিমাপের বিভিন্ন ইউনিট থাকতে পারে তবে একটি মোটও রয়েছে - যা ব্যবহারকারী-নির্বাচিত ইউনিটে রূপান্তর করার পরে মোট।
ক্যাড রক্স

7

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

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

বিভিন্ন সমর্থিত ইউনিটের মধ্যে রূপান্তরকরণের জন্য ইউনিট রূপান্তর টেবিলগুলি আপনার অ্যাপ্লিকেশনের মধ্যে হার্ডকড করা যেতে পারে, কারণ পরিমাপের নতুন ইউনিটগুলি খুব কমই পরিবর্তিত হয়।

এনবি অন্য কোনও সম্পর্কিত সম্পর্কিত সমাধান হ'ল ডেটাবেজে টাইমস্ট্যাম্পগুলি সর্বদা 'বেস' ইউনিটে সংরক্ষণ করার সময় - ইউটিসি

এই বিষয়ে আরও একটি সম্পর্কিত প্রশ্নোত্তর ...

  • /programming/12977021/best-practice-for-storing-weights-in-a-sql-database

  • এটি আসল বিশ্বের পরিমাপগুলি সংরক্ষণ করার সময় কেন ভাসমান পয়েন্ট কলামের ধরণটি ব্যবহার করার সবচেয়ে ভাল উপায় তা সম্পর্কে কিছু ভাল তথ্য রয়েছে।


5

যেহেতু যে কোনও ইউনিট সূত্রের সাথে একই ধরণের অন্য ইউনিটে রূপান্তরিত হতে পারে:

y = ((x + xOffset) * multiplicand / denominator) + yOffset

আমি একটি টেবিল তৈরি করব যা ইউনিটের ধরণের প্লাস এই 4 টি মান রাখে।

From Unit     To Unit      Unit Type    From Offset    Multiplicand    Denominator    To Offset
'milligrams'  'grams'      'mass'       0              1               1000           0
'grams'      'kilograms'   'mass'       0              1               1000           0
'grams'      'ounces'      'mass'       0              100000          2835           0
'ounces'     'pound'       'mass'       0              1               16             0

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

সকল প্রকারের মধ্যে রূপান্তর যুক্ত করতে কিছু ফিল্টার সহ একটি ক্রস জয়েন বাকি বাকী রূপান্তরগুলি সন্নিবেশ করতে পারে।


3

@ টড এভারেটের উত্তরটি পড়ার পরে, আমার কাছে একটি সমাধান এসেছিল, তাই আমি এগিয়ে গিয়ে নিজের প্রশ্নের উত্তর দিতে যাচ্ছি। কি মনে হয় আমি কি করতে যাচ্ছি একটি পৃথক তৈরি করা ColumnUnitsচার কলাম সহ টেবিল: Schema, Table, Column, UnitsID(যেখানে UnitsID এফ কে আলাদা হয় UnitsOfMeasureএইভাবে মেজার তার যুক্ত ইউনিটে কোনো কলাম ম্যাপিং টেবিল)। স্পষ্টতই এই ধারণার বৃহত্তম ক্ষতিটি হ'ল বিকাশকারীরা যখনই কোনও কলাম বা টেবিলের নাম পরিবর্তন করে [ সম্ভবত কোনও ডিডিএল ট্রিগার ব্যবহার করবেন) এই টেবিলটি সম্পাদনা করতে হবে ? ], অন্যথায় সিস্টেমটি ভেঙে যাবে। তবে এই ধরণের নাম পরিবর্তনগুলি দুর্লভ, এবং দেব-দোকান ছোট (কেবলমাত্র এক ব্যক্তি, আমার ক্ষেত্রে), এই স্থাপত্যটি কার্যক্ষম হবে ass সুবিধাটি হ'ল বর্তমান ডিবিতে কোনও আক্রমণাত্মক পরিবর্তন করতে হবে না, এবং আমার মূল পোস্টে আমার দ্বিতীয় বিকল্প হিসাবে আমার সর্বাধিক বিকল্পের প্রয়োজন হিসাবে আমি প্রতি কলামের জন্য একবারে মূল্যটি সংরক্ষণ করতে হবে।


আকর্ষণীয় ধাঁধা ... এবং আপনার কাছে আকর্ষণীয় ধারণা। আপনার ধারণাটি জিজ্ঞাসা করা সহজ করে তুলবে, তবে এটি খুব বেশি অর্জন বলে মনে হচ্ছে না। আপনি স্রেফ রেফারেন্স ডেটা অন্য জায়গায় সরিয়ে নিয়েছেন। আমাকে এই নকশাটি সম্পর্কে সবচেয়ে বেশি বিরক্ত করে কী
স্যার ওয়েয়ার্স-এ-লট

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