mysql - প্রথমবার ডাটাবেস নকশা: আমি overengineering হয়?




database database-design (8)

আপনার প্রশ্নের আরো কিছু উত্তর:

1) আপনি যে কোনও ব্যক্তির কাছে প্রথমবারের মত এমন সমস্যাটির জন্য লক্ষ্যমাত্রা অর্জন করেছেন। আমি এই প্রশ্নের উপর অন্যদের থেকে পয়েন্টার মনে করে এতদূর অনেক সুন্দর এটা আবরণ। সাবাশ!

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

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

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

এটি সমস্ত একটি লম্বা বাতাসের রশ্মি যা আপনি তৈরি করছেন এমন ডিবিটির ভূমিকা প্রদত্ত ডিজাইন নীতিগুলি এবং কৌশলগুলিকে পৃথক করে তুলতে পারে। আমি আশা করি যে সহায়ক।

পটভূমি

আমি প্রথম বছর সিএস ছাত্র নই এবং আমি আমার বাবার ছোট ব্যবসার জন্য পার্ট টাইম কাজ করি। আমি বাস্তব বিশ্বের অ্যাপ্লিকেশন উন্নয়ন কোনো অভিজ্ঞতা নেই। আমি পাইথন স্ক্রিপ্ট লিখেছি, সি-তে কিছু পাঠ্যক্রম, কিন্তু এরকম কিছু না।

আমার বাবা একটি ছোট প্রশিক্ষণ ব্যবসা এবং বর্তমানে সব ক্লাস নির্ধারিত হয়, একটি বহিরাগত ওয়েব অ্যাপ্লিকেশন মাধ্যমে রেকর্ড এবং অনুসরণ। একটি এক্সপোর্ট / "রিপোর্ট" বৈশিষ্ট্য আছে কিন্তু এটি খুব জেনেরিক এবং আমাদের নির্দিষ্ট প্রতিবেদন প্রয়োজন। আমরা প্রশ্ন চালানোর জন্য প্রকৃত ডাটাবেস অ্যাক্সেস নেই। আমি একটি কাস্টম রিপোর্টিং সিস্টেম সেট আপ করতে বলা হয়েছে।

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

আমরা শীঘ্রই আন্তর্জাতিক ক্লায়েন্ট থাকার শুরু হতে পারে, তাই আমি / ডেটা যে ঘটতে হলে ডাটাবেস বিস্ফোরিত করতে চান না। আমরা বর্তমানে বিভিন্ন বিভাগের সাথে ক্লায়েন্ট হিসাবে একটি দম্পতি বড় কর্পোরেশন আছে (যেমন ACME পিতামাতার সংস্থা, ACME স্বাস্থ্যসেবা বিভাগ, ACME শরীরের যত্ন বিভাগ)

আমি যে স্কিমাটি নিয়ে এসেছি তা নিম্নরূপ:

  1. ক্লায়েন্ট দৃষ্টিকোণ থেকে:
    • ক্লায়েন্ট প্রধান টেবিল
    • ক্লায়েন্টদের জন্য তারা কাজ বিভাগ লিঙ্ক করা হয়
      • বিভাগগুলি একটি দেশের চারপাশে ছড়িয়ে যাবে: লন্ডনে এইচআর, সোয়ানসিতে বিপণন ইত্যাদি।
      • বিভাগ একটি কোম্পানির বিভাগ সংযুক্ত করা হয়
    • বিভাগ পিতামাতার সাথে যুক্ত করা হয়
  2. ক্লাস দৃষ্টিকোণ থেকে:
    • অধিবেশন প্রধান টেবিল হয়
      • একটি শিক্ষক প্রতিটি অধিবেশন লিঙ্ক করা হয়
      • একটি সেশনড প্রতিটি অধিবেশন দেওয়া হয়। যেমন 0 - সমাপ্ত, 1 - বাতিল করা হয়েছে
      • সেশনগুলি একটি আনুমানিক আকারের "প্যাক" গোষ্ঠীভুক্ত করা হয়
    • প্রতিটি প্যাক একটি ক্লায়েন্ট বরাদ্দ করা হয়

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

alt text http://maian.org/img/schema.png

উদাহরণ জিজ্ঞাসা আমি চলমান হবে

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

প্রশ্ন (গুলি)

  • এই overengineered বা আমি ডান উপায় নেতৃত্বে হয়?
  • অধিকাংশ প্রশ্নের জন্য একাধিক টেবিলের যোগদান প্রয়োজন একটি বড় কর্মক্ষমতা আঘাত ফলাফল?
  • আমি ক্লায়েন্টদের একটি 'স্থগিতাদেশ' কলাম যোগ করেছি, এটি সম্ভবত একটি সাধারণ ক্যোয়ারী হতে যাচ্ছে। এই একটি ভাল ধারণা বা আমি ডাটাবেস কঠোরভাবে স্বাভাবিক রাখা উচিত?

আপনার সময় জন্য ধন্যবাদ


আপনি সঠিক ধারণা পেয়েছেন। তবে আপনি এটি পরিষ্কার করতে পারেন এবং কিছু ম্যাপিং (আছে *) সারণী মুছে ফেলতে পারেন।

আপনি বিভাগীয় টেবিলে কি করতে পারেন, CityId এবং DivisionId যোগ করুন।

এ ছাড়া, আমি মনে করি সবকিছু ঠিক আছে ...


আমি পরিবর্তন করতে হবে শুধুমাত্র পরিবর্তন হয়:
1- আপনার VARCHAR NVARCHAR তে পরিবর্তন করুন, যদি আপনি আন্তর্জাতিক যান, আপনি ইউনিকোড চান।

2- আপনার ইন্ট আইডিটি যদি সম্ভব হয় তাহলে GUIDs (uniqueidentifier) ​​পরিবর্তন করুন (এটি কেবল আমার ব্যক্তিগত পছন্দ হতে পারে)। আপনি একাধিক পরিবেশে (ডেভ / পরীক্ষা / স্টেজিং / প্রড) যেখানে বিন্দুতে অবশেষে পৌঁছাবেন, আপনি এক থেকে অন্য তথ্য স্থানান্তর করতে চাইতে পারেন। GUID আইডি এই উল্লেখযোগ্য সহজ করে তোলে।

3 - আপনার কোম্পানির জন্য তিনটি স্তর -> বিভাগ -> বিভাগের কাঠামো যথেষ্ট নাও হতে পারে। এখন, এটি বেশি-প্রকৌশল হতে পারে, তবে আপনি সেই অনুক্রমটি সাধারণকরণ করতে পারেন যেমন আপনি গভীরতার এন-স্তরের সমর্থন করতে পারেন। এটি আপনার কিছু প্রশ্নগুলিকে আরও জটিল করে তুলবে, যাতে এটি ট্রেড-অফের মূল্যহীন নাও হতে পারে। অধিকন্তু, এটি এমন যে কোনও ক্লায়েন্টের আরো স্তর থাকতে পারে এই মডেলটিতে সহজেই "স্টাফয়েবল" হতে পারে।

4- আপনার একটি ক্লায়েন্ট টেবিলে একটি স্ট্যাটাস রয়েছে যা একটি VARCHAR এবং স্থিতিবিন্যাস সারণির সাথে কোন লিঙ্ক নেই। ক্লায়েন্ট স্ট্যাটাসের প্রতিনিধিত্ব করার জন্য আমি একটু স্বচ্ছতা আশা করি।


আমি প্রশিক্ষণ / স্কুল ডোমেনে কাজ করেছি এবং আমি ভাবলাম যে আপনি "সেশন" (প্রদত্ত কোর্সের উদাহরণগুলি) এবং অবশ্যই অবশ্যই কোনও M: 1 সম্পর্কের সাথে সম্পর্কযুক্ত। অন্য কথায়, আপনার ক্যাটালগ কোর্স ("স্প্যানিশ 101" বা যাই হোক না কেন) প্রদান করে, তবে আপনার একটি একক সেমিস্টারের সময় এটির দুটি আলাদা উদাহরণ থাকতে পারে (আপনি স্মিথের দ্বারা শিক্ষা দিয়েছেন Tu-Th, Wed-Fri দ্বারা জুন-শুক্র)।

অন্য যে, এটি একটি ভাল শুরু মত দেখায়। আমি বিশ্বাস করি যে আপনি ক্লায়েন্ট ডোমেইন (গ্রাফগুলি "ক্লায়েন্টদের" কাছে যাচ্ছেন এমন গ্রাফগুলি) আপনার মডেলের তুলনায় আরও জটিল, তবে আপনার গাইড করার জন্য আপনার কাছে কিছু বাস্তব তথ্য না পাওয়া পর্যন্ত এটির উপরে তাকাবেন না।


এটি অতিরিক্ত প্রকৌশলী নয়, এইভাবে আমি সমস্যাটির দিকে এগিয়ে যাব। যোগদান ভাল, একটি কর্মক্ষমতা আঘাত অনেক হবে না (যদি আপনি ডাটাবেস ডি-স্বাভাবিক না হওয়া পর্যন্ত এটি সম্পূর্ণরূপে প্রয়োজনীয়! যা সুপারিশ করা হয় না!)। স্ট্যাটাসের জন্য, আপনি টেবিলটি অপ্টিমাইজ করার পরিবর্তে একটি enum datatype ব্যবহার করতে পারেন কিনা তা দেখুন।


কিছু জিনিস মনে মনে আসে:

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

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

  3. "প্যাক" ধারণার সব স্পষ্ট নয়।

  4. আপনি এটি একটি ছোট ব্যবসা নির্দেশ করে যেহেতু, বর্তমান মেশিনগুলির গতি এবং ক্ষমতা বিবেচনা করে পারফরম্যান্স একটি সমস্যা হলে এটি বিস্ময়কর হবে।


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

আরেকটি জিনিস: আপনি কি সত্যিই বিশ্বাস করেন যে আপনার 'শহর' এবং 'দেশগুলির টেবিল' দরকার? বিভাগের টেবিলের একটি 'শহর' এবং 'দেশ' কলাম আপনার ব্যবহারের ক্ষেত্রে যথেষ্ট নয়? যেমন আপনার দেশের আবেদন শহর এবং শহর দ্বারা বিভাগ তালিকা প্রয়োজন?


যাইহোক, এটি উল্লেখযোগ্য যে আপনি যদি ইতিমধ্যেই CSV তৈরি করছেন এবং তাদের একটি MySQL ডাটাবেস লোড করতে চান তবে লোড ডেটা স্থানীয় ইনফিল হল আপনার সেরা বন্ধু: http://dev.mysql.com/doc/refman/5.1/en/load-data.html । Myslimlimport এছাড়াও খুঁজছেন মূল্য, এবং একটি কমান্ড লাইন টুল যা মূলত লোড তথ্য infile কাছাকাছি একটি ভাল wrapper।






database-normalization