সর্বাধিক সাধারণ এসকিউএল বিরোধী নিদর্শনগুলি কী কী? [বন্ধ]


232

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


এটি এমন একটি প্রশ্ন যা স্ট্যাক ওভারফ্লোয়ের জন্য কী ধরণের প্রশ্ন উপযুক্ত তা সম্পর্কে নতুন মানগুলির সাথে খাপ খায় না। যখন এটি জিজ্ঞাসা করা হয়েছিল, এটি সম্ভবত সত্য ছিল না।
ডেভিড ম্যানহিম

@ ক্যাস্পারওন এমন কিছু "historicalতিহাসিক তাত্পর্য" ধারা নেই যা দাদাকে এই প্রশ্নটি গ্রহণযোগ্যতায় পরিণত করবে?
অ্যামি বি

26
আমি এটি দুঃখজনক মনে করি যে ওয়াহোল সাইটে সর্বাধিক দরকারী প্রশ্নগুলির একটি গঠনমূলক না হিসাবে বন্ধ রয়েছে।
এইচএলজিইএম

11
@ এইচএলজিইএম আমি সম্পূর্ণরূপে একমত এই প্রশ্নটি স্ট্যাক এক্সচেঞ্জের সাথে যা কিছু ভুল রয়েছে তার একটি নিখুঁত উদাহরণ
কেভিন মোর্স

1
বিষয়টি একেবারে গুরুত্বপূর্ণ এবং প্রাসঙ্গিক। তবে প্রশ্নটি খুব খোলামেলা, যার জন্য প্রতিটি উত্তর পৃথক প্রকৌশলের ব্যক্তিগত বিরোধী-প্যাটার্ন বাগবার বর্ণনা করে।
শেন 21

উত্তর:


156

আমি বেশিরভাগ প্রোগ্রামারদের ডেটা অ্যাক্সেস লেয়ারে তাদের ইউআই-লজিক মিশ্রিত করার প্রবণতা দ্বারা ক্রমাগত হতাশ:

SELECT
    FirstName + ' ' + LastName as "Full Name",
    case UserRole
        when 2 then "Admin"
        when 1 then "Moderator"
        else "User"
    end as "User's Role",
    case SignedIn
        when 0 then "Logged in"
        else "Logged out"
    end as "User signed in?",
    Convert(varchar(100), LastSignOn, 101) as "Last Sign On",
    DateDiff('d', LastSignOn, getDate()) as "Days since last sign on",
    AddrLine1 + ' ' + AddrLine2 + ' ' + AddrLine3 + ' ' +
        City + ', ' + State + ' ' + Zip as "Address",
    'XXX-XX-' + Substring(
        Convert(varchar(9), SSN), 6, 4) as "Social Security #"
FROM Users

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

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


10
সর্বাধিক সংখ্যক স্তর / বিমূর্ত স্তর স্তর জুড়ে সর্বাধিক সংযোগের জন্য একটি ভাল পোস্টার-শিশু বিন্যাস।
dkretz

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

54
লোকেরা এইচটিএমএল এবং জাভাস্ক্রিপ্ট এম্বেড করে রাখলে আমার পছন্দটি হয়, যেমন নির্বাচন করুন '<a href=... onclick="">' + নাম '</a>'
ম্যাট রোগিশ

15
এই জাতীয় প্রশ্নের সাথে, আপনি একটি সহজ পরিবর্তনের বিবৃতি দিয়ে কোনও ওয়েবসাইটটিতে গ্রিড সম্পাদনা করতে পারেন। বা একটি রফতানির সামগ্রী পরিবর্তন করুন, বা একটি রিপোর্টে একটি তারিখ পুনরায় ফর্ম্যাট করুন। এটি ক্লায়েন্টদের খুশি করে এবং আমার সময় সাশ্রয় করে। সুতরাং ধন্যবাদ, তবে না ধন্যবাদ, আমি এই জাতীয় প্রশ্নের সাথে আটকে থাকব।
Andomar

4
@ ম্যাট রোগিশ - জেসুস, কেউ আসলে তা করে?
অ্যাক্সারিড্যাক্স

118

এখানে আমার শীর্ষ 3।

নম্বর 1. একটি ক্ষেত্রের তালিকা নির্দিষ্ট করতে ব্যর্থ। (সম্পাদনা: বিভ্রান্তি রোধ করতে: এটি একটি প্রোডাকশন কোড বিধি। এটি এক-অফ বিশ্লেষণ স্ক্রিপ্টগুলিতে প্রযোজ্য না - যদি না আমি লেখক হয়))

SELECT *
Insert Into blah SELECT *

হতে হবে

SELECT fieldlist
Insert Into blah (fieldlist) SELECT fieldlist

সংখ্যা 2 একটি কার্সার ব্যবহার করে এবং লুপ করার সময়, যখন একটি লুপ ভেরিয়েবল সহ যখন লুপটি করবে।

DECLARE @LoopVar int

SET @LoopVar = (SELECT MIN(TheKey) FROM TheTable)
WHILE @LoopVar is not null
BEGIN
  -- Do Stuff with current value of @LoopVar
  ...
  --Ok, done, now get the next value
  SET @LoopVar = (SELECT MIN(TheKey) FROM TheTable
    WHERE @LoopVar < TheKey)
END

সংখ্যা 3. স্ট্রিং প্রকারের মাধ্যমে ডেটলজিক।

--Trim the time
Convert(Convert(theDate, varchar(10), 121), datetime)

হতে হবে

--Trim the time
DateAdd(dd, DateDiff(dd, 0, theDate), 0)

আমি একটি সাম্প্রতিক স্পাইক দেখেছি "দু'জনের চেয়ে এক ক্যোরি ভাল, এমিরাইট?"

SELECT *
FROM blah
WHERE (blah.Name = @name OR @name is null)
  AND (blah.Purpose = @Purpose OR @Purpose is null)

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


7
হুঁ, আমি আপনাকে কেবল 2 এবং 3 পয়েন্টের জন্য একটি +1 দেব, কিন্তু বিকাশকারীরা ওভারপ্লে নিয়ম 1 এর মাঝে মাঝে এটির জায়গা থাকে।
অন্নাকাটা

1
# 1 এর পিছনে যুক্তি কী?
জলফ

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

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

4
... তবে সেট-ভিত্তিক এসকিউএল দিয়ে কীভাবে কাজ করবেন তা নির্ধারণের ব্যর্থতার পরে অবশ্যই কার্সারগুলি প্রায় সর্বদা একটি শেষ অবলম্বন হওয়া উচিত। আমি একবার সঞ্চিত পদ্ধতিতে একটি ভয়াবহ, বিশাল পিএল / এসকিউএল কার্সারটি সাবধানে বিচ্ছিন্ন করে প্রায় 45 মিনিট সময় কাটিয়েছি (পচা জিনিসটির চিত্রগুলি আঁকিয়েছি), যা একটি বড় টেম্প টেবিলটি তৈরি করেছে তারপরে টেম্প টেবিলের বিষয়বস্তুগুলি কল সরবরাহকারীকে পুনরায় রেন্ডার করতে বেছে নিয়েছিল a রিপোর্ট। যথেষ্ট হার্ডওয়ারে, এটি চালাতে 8.5 মিনিট সময় নেয়। পুরো জিনিসটি ডায়াগ্রাম করার পরে, আমি এটিকে একটি একক ক্যোয়ারী দ্বারা প্রতিস্থাপন করতে সক্ষম হয়েছি যা 2 সেকেন্ডের নীচে একই ফলাফলগুলি দিয়েছিল। কার্সার্স, মানুষ ...
ক্রেগ

71
  • মানব পাঠযোগ্য পাসওয়ার্ড ক্ষেত্র , যেমন। স্ব বর্ণনামূলক।

  • ইনডেক্সড কলামগুলির তুলনায় লাইক ব্যবহার করা এবং আমি সাধারণভাবে শুধু লাইক বলতে প্রলুব্ধ করি।

  • এসকিউএল-উত্পন্ন পিকে মান পুনর্ব্যবহার করা।

  • আশ্চর্য কেউ এখনও দেবতার টেবিল উল্লেখ করেনি। বিট পতাকা, বড় স্ট্রিং এবং পূর্ণসংখ্যার 100 কলামের মতো "জৈব" কিছুই বলে না।

  • তারপরে "আমি মিস করি .ini ফাইলগুলি" প্যাটার্ন রয়েছে: বড় টেক্সট ক্ষেত্রে CSVs , পাইপ সীমানাযুক্ত স্ট্রিংগুলি বা অন্যান্য পার্স প্রয়োজনীয় ডেটা সংরক্ষণ করে।

  • এবং এমএস এসকিউএল সার্ভারের জন্য আদৌ কার্সার ব্যবহার । কোনও প্রদত্ত কার্সার কার্য করার আরও ভাল উপায় আছে।

সম্পাদনা হয়েছে কারণ অনেক আছে!


19
এক্সিকিউটেবল-এর পাথ ভুল, আমি কোন বিশেষ জিনিস করছেন বলে সম্পর্কে দ্বিধাগ্রস্ত হতে হবে 100% সঠিক বা 100% ভুল
শন

4
এখনও অবধি প্রতিটি কার্সর প্রতিরক্ষা উদাহরণ আমি দেখেছি কাজের জন্য ভুল সরঞ্জামটি ব্যবহার করছে। তবে আপনি যদি সমস্ত জানেন সেগুলি এসকিউএল হয় তবে আপনি এটি যথাযথভাবে ব্যবহার করেন বা আপনি অন্যান্য ধরণের সফ্টওয়্যার লিখতে শিখেন।
dkretz

3
@ টিনস্টোয়েল: '% ব্লাহ%' লাইক কীভাবে একটি সূচক ব্যবহার করতে পারে? সূচক ক্রম উপর নির্ভর করে এবং এই উদাহরণ একটি স্ট্রিং এর এলোমেলো মাঝারি অবস্থান অনুসন্ধান করে। (
সূচকগুলি

12
বেশিরভাগ ডাটাবেস সার্ভারে (কমপক্ষে আমি যেগুলি ব্যবহার করেছি) লাইক সূচিগুলি ব্যবহার করতে পারে .. যতক্ষণ না এটি উপসর্গ-অনুসন্ধান ('xXX%' পছন্দ করুন) - যতক্ষণ ওয়াইল্ডকার্ডের অক্ষর না থাকে অনুসন্ধানের স্ট্রিংয়ে প্রথম আসুন। আমি মনে করি আপনি এখানে কিছুটা আন্তঃ-উদ্দেশ্য নিয়ে কথা বলছেন।
কাউয়ান

10
এটি আপনার পছন্দ নয় এমন LIKE '%LIKE'
জোহান

62

এটির জন্য গভীর খনন করতে হবে না: প্রস্তুত বিবৃতি ব্যবহার না করা।


3
হা. "ট্র্যাপিংয়ের ত্রুটিগুলি" না করে আমার অভিজ্ঞতায় একই প্রসঙ্গে খুব কাছ থেকে অনুসরণ করা Follow
dkretz

1
@ স্টেস্ট: ভিউগুলি ব্যবহার এবং পরিবর্তনশীল প্রতিবেদনের তারিখের তুলনায় এটি কিছুই নয়। আপনার যদি পরিবর্তনশীল প্রতিবেদনের তারিখ থাকে তবে ভিউগুলি একটি অ্যান্টিপ্যাটার্ন হয় (আমি ধরেছি বেশিরভাগ অ্যাপ্লিকেশন রয়েছে)। এটি একটি পৃথক উত্তরে যুক্ত করবে তবে দুর্ভাগ্যক্রমে এটি বন্ধ রয়েছে।
স্টিফান স্টেইগার

56

অর্থহীন টেবিলের উপকরণ ব্যবহার:

from employee t1,
department t2,
job t3,
...

একটি বৃহত্তর এসকিউএল স্টেটমেন্টটি পড়ার প্রয়োজন হওয়ার চেয়ে অনেক বেশি শক্ত করে তোলে


49
alias লেখা?
হ্যালো

10
ক্ষতিকারক উপকরণগুলি ঠিক আছে। আপনি যদি কোনও অর্থপূর্ণ নাম চান তবে কোনও উপাধি ব্যবহার করবেন না।
জোয়েল কোহোর্ন

43
তিনি "সংশ্লেষ" বলেন নি, তিনি বলেছিলেন "অর্থহীন।" আমার বইতে উদাহরণ, ক্যোয়ারীর এলিয়াস হিসাবে ই, ডি এবং জ ব্যবহার করে কোনও ভুল হবে না।
রবার্ট রসনি

11
অবশ্যই, রবার্ট - ই, ডি এবং জ আমার সাথে ভাল থাকবে।
টনি অ্যান্ড্রুজ

8
আমি কাজের জন্য বিভাগের এবং কাজের জন্য কর্মী জন্য EMP, প্রস্থাঃ (হয়তো বা JB) :) ব্যবহার করেন
আন্দ্রেই Rînea

53
var query = "select COUNT(*) from Users where UserName = '" 
            + tbUser.Text 
            + "' and Password = '" 
            + tbPassword.Text +"'";
  1. অন্ধভাবে ব্যবহারকারী ইনপুট বিশ্বাস
  2. প্যারামিটারাইজড কোয়েরি ব্যবহার করা হচ্ছে না
  3. ক্লিয়ারটেক্সট পাসওয়ার্ড

এর সবগুলিই কিছু (যে কোনও) ধরণের ডেটাবেস অ্যাস্ট্রাক্টন স্তর ব্যবহার করে কার্যকরভাবে মোকাবেলা করা যেতে পারে।
dkretz

@ ডুফলেডরফার: সম্মত হোন, মধ্যম স্তরটি এরকম ক্ষেত্রে অবশ্যই আরও ভাল হবে, পাশাপাশি ফলাফলগুলি একটি চমৎকার পার্শ্ব প্রতিক্রিয়া হিসাবে ক্যাশে প্রদান করে।
জো পাইনেদা

দারুণ উদাহরণ। যদি কোনও দেব কোনও ভাল সমাধানের মাধ্যমে কীভাবে এটি প্রতিস্থাপন করতে চান তবে তারা শালীন এসকিউএল দেব হয়ে উঠার অর্ধেক উপায়।
স্টিভ ম্যাকলিউড

46

আমার বাগবিয়ারগুলি 450 কলামের অ্যাক্সেস সারণী যা ম্যানেজিং ডিরেক্টর এর সেরা বন্ধু কুকুর গ্রুমার এবং 8 বছর বয়সী পুত্র দ্বারা একসাথে রাখা হয়েছে যা কেবলমাত্র উপস্থিত রয়েছে কারণ কেউ জানেন না যে কীভাবে একটি ডাস্টাস্ট্রাকচারকে সঠিকভাবে সাধারণকরণ করতে হয়।

সাধারণত, এই সন্ধানের টেবিলটি দেখতে এমন দেখাচ্ছে:

আমি করি নি,
নাম এনভিচারার (132),
ইন্টারভ্যালু 1 আইএনটি,
ইন্টারভ্যালু 2 আইএনটি,
চরভ্যালু 1 এনভিচারার (255),
চরভ্যালু 2 এনভিচারার (255),
তারিখ 1 তারিখ,
তারিখ 2 তারিখ

আমি দেখেছি এমন ক্লায়েন্টের সংখ্যা আমি হারিয়েছি যাঁর কাছে এমন সিস্টেম রয়েছে যা এই জাতীয় জঘন্য আচরণের উপর নির্ভর করে।


1
আরও খারাপটি, আমি পড়েছি যে অ্যাক্সেসের নতুন সংস্করণে যা স্বয়ংক্রিয়ভাবে সমর্থিত, যা আমি আশঙ্কা করি এই মান 1, মান 2, মান 3 এর আরও উত্সাহিত করবে ... কলাম ফেটিচিজম
জো পিনেদা

অপেক্ষা করুন - সুতরাং 8 বছরের ছেলে কুকুর গ্রুমারের পুত্র?
ব্যারিপিকারটি

28

যেগুলি আমি সবচেয়ে বেশি অপছন্দ করি তা হ'ল

  1. টেবিল, স্প্রোকস ইত্যাদি তৈরি করার সময় স্পেস ব্যবহার করে আমি ক্যামেলকেস বা আন্ডার_স্কোর এবং একবচন বা বহুবচন এবং ইউপিপ্রেসিএসই বা ছোট হাতের সাথে ভাল আছি তবে একটি টেবিল বা কলাম [স্পেস সহ] উল্লেখ করতে হবে, বিশেষত যদি [এটি অদ্ভুতভাবে ফাঁকা থাকে] (হ্যাঁ, আমি এর মধ্যে দৌড়েছি) সত্যিই আমাকে বিরক্ত করে।

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

  3. ভিউ বা কার্সরগুলির অতিরিক্ত ব্যবহার। দর্শনগুলির একটি উদ্দেশ্য থাকে তবে প্রতিটি টেবিল যখন একটি দৃশ্যে আবৃত থাকে তখন এটি অনেক বেশি। আমাকে কয়েকবার কার্সার ব্যবহার করতে হয়েছিল তবে সাধারণত আপনি এটির জন্য অন্য পদ্ধতি ব্যবহার করতে পারেন।

  4. অ্যাক্সেস। একটি প্রোগ্রাম একটি বিরোধী নিদর্শন হতে পারে? আমাদের কাজটিতে এসকিউএল সার্ভার রয়েছে, তবে অ-প্রযুক্তিগত ব্যবহারকারীদের কাছে এটি সহজলভ্য, "ব্যবহারের সহজতা" এবং "বন্ধুত্বপূর্ণতা" কারণে অনেক লোক অ্যাক্সেস ব্যবহার করে। এখানে যাওয়ার জন্য অনেক কিছুই রয়েছে তবে আপনি যদি একইরকম পরিবেশে থাকেন তবে আপনি জানেন।


2
# 4 - এখানে আরও একটি থ্রেড রয়েছে কেবল <a href=' stackoverflow.com/questions/327199/…> :) এর জন্য।
dkretz

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

26

স্টোর পদ্ধতির নামের উপসর্গ হিসাবে এসপি ব্যবহার করুন কারণ এটি প্রথমে কাস্টমগুলির চেয়ে সিস্টেম পদ্ধতিগুলির স্থানে অনুসন্ধান করবে।


1
সমস্ত সঞ্চিত পদ্ধতির জন্য অন্য যে কোনও সাধারণ উপসর্গ ব্যবহারের ক্ষেত্রেও বাড়ানো যেতে পারে, যাতে বাছাই করা তালিকার মাধ্যমে নেওয়া আরও কঠিন হয়ে যায়।
dkretz

7
ডুফলেডরফার মন্তব্যের জন্য +1 !! আমি এটি অনেক দেখেছি, আমি এই বুদ্ধিমান খুঁজে পাই এবং প্রকৃতপক্ষে কোনও নির্দিষ্ট এসপি অনুসন্ধান করা খুব কঠিন করে তোলে !!! দেখার জন্য "ভিডব্লিউ_", টেবিলগুলির জন্য "tbl_" এবং এর মতো প্রসারিতও আছে, আমি কীভাবে তাদের ঘৃণা করি!
জো পাইনেদা

1
আপনি যদি বস্তুগুলিকে ফাইলগুলিতে স্ক্রিপ্ট করেন তবে উপসর্গগুলি কার্যকর হতে পারে (যেমন: উত্স নিয়ন্ত্রণ, মোতায়েন বা মাইগ্রেশনের জন্য)
রিক

1
কেন পৃথিবীতে এসপি বা ইউএসপি সহ প্রতিটি একক সঞ্চিত প্রক্রিয়া উপসর্গ করা কার্যকর হবে ? এটি আপনি চান তার জন্য তালিকাটি স্ক্যান করা আরও শক্ত করে তোলে।
রায়ান লুন্ডি

25

অস্থায়ী সারণী এবং কার্সারের অতিরিক্ত ব্যবহার।


2
ভালো প্রমাণ যে "আমি জানি সমস্ত প্রক্রিয়াজাতীয় ভাষা"।
dkretz

2
কোনও কিছুর অতিরিক্ত ব্যবহার হ'ল সংজ্ঞা দ্বারা অযাচিত। টেম্প টেবিল / কার্সার ব্যবহারের প্রয়োজন নেই এমন একটি নির্দিষ্ট উদাহরণ সহায়ক হবে।
জেস রিয়া

6
বেশিরভাগ ক্ষেত্রে আমি টেম্প টেবিলগুলি স্বল্প-ব্যবহৃত দেখি। এসকিউএল সার্ভারের সাহায্যে আপনি প্রায়শ এক একরকম ক্যোরির পরিবর্তে বেশ কিছু টেম্প টেবিল দিয়ে স্টাফ করে কর্মক্ষমতা অর্জন করেন gain
Cervo

24

সময়ের মানগুলি সংরক্ষণ করার জন্য, কেবলমাত্র ইউটিসি টাইমজোন ব্যবহার করা উচিত। স্থানীয় সময় ব্যবহার করা উচিত নয়।


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

1
@ সিংসরহালমাই অনেক জায়গাতে দিবালোক সঞ্চয় অনুশীলন করে, তাই সময় পরিবর্তনের এক ঘন্টার মধ্যে সময়ের মানগুলি অস্পষ্ট হতে পারে।
ফ্র্যাঙ্ক শ্যুইটারম্যান

এটি অবশ্যই বর্তমান এবং অতীতের জন্য সঠিক, তবে ভবিষ্যতের জন্য, বিশেষত সুদূরপরায়ন ভবিষ্যতের জন্য, সুস্পষ্ট সময় অঞ্চলগুলি প্রায়শই একটি প্রয়োজন। আপনার যদি 30 বছরের একটি বিকল্প থাকে যা সবে লিখিত ছিল এবং 2049-09-27T17: 00: 00 নিউ ইয়র্কের সময় হয়, তবে আপনি কেবল অন্ধভাবে ধরে নিতে পারবেন না এটি 21: 00: 00Z হবে। মার্কিন কংগ্রেস সম্ভবত ডিএসটি নিয়ম পরিবর্তন করতে পারে। আপনাকে স্থানীয় সময় এবং সত্য সময় অঞ্চল (আমেরিকা / নিউ_ইয়র্ক) আলাদা রাখতে হবে।
জন কোয়ান

23

SCOPE_IDENTITY () এর পরিবর্তে @@ পরিচয় ব্যবহার করা হচ্ছে

এই উত্তর থেকে উদ্ধৃত :

  • @@ পরিচয়টি সমস্ত স্কোপ জুড়ে বর্তমান সেশনের যে কোনও সারণীর জন্য উত্পন্ন সর্বশেষ পরিচয় মানটি দেয়। আপনার এখানে সতর্কতা অবলম্বন করা উচিত, যেহেতু এটি স্কোপগুলি জুড়ে। আপনি আপনার বর্তমান বিবৃতি পরিবর্তে ট্রিগার থেকে একটি মান পেতে পারেন।
  • SCOPE_IDENTITY বর্তমান সেশনে এবং বর্তমান সুযোগের যে কোনও সারণীর জন্য উত্পন্ন সর্বশেষ পরিচয় মানটি প্রদান করে। সাধারণত আপনি যা ব্যবহার করতে চান তা।
  • IDENT_CURRENT কোনও সেশনে এবং কোনও সুযোগে একটি নির্দিষ্ট টেবিলের জন্য উত্পন্ন শেষ পরিচয় মানটি প্রদান করে value উপরের দুটি দুটি আপনার যা প্রয়োজন (খুব বিরল) আপনার যদি প্রয়োজন না হয় তবে এটি আপনাকে কোন টেবিলের থেকে মূল্য চান তা নির্দিষ্ট করতে দেয়। আপনি যদি এমন কোনও টেবিলের জন্য বর্তমান পরিচয় মান পেতে চান যা আপনি কোনও রেকর্ড প্রবেশ করান নি You

+1 খুব সত্য, একটি বাগের কারণ হতে পারে যা আগাছা থেকে বেরিয়ে আসা কঠিন
অক্সারিড্যাক্স

23

'মৃত' ক্ষেত্রটি পুনরায় ব্যবহারের উদ্দেশ্যে নয় এমন কিছু (উদাহরণস্বরূপ 'ফ্যাক্স' ফিল্ডে ব্যবহারকারীর ডেটা সংরক্ষণ করা) - তাত্ক্ষণিক দ্রুত সমাধানের জন্য খুব লোভনীয়!


21
select some_column, ...
from some_table
group by some_column

এবং ধরে নেওয়া যায় যে ফলাফলটি কিছু_ কলাম দ্বারা সাজানো হবে। আমি এটি সাইবাসের সাথে কিছুটা দেখেছি যেখানে অনুমানটি ধারণ করে (আপাতত)।


1
বাছাইয়ের আদেশটি ধরে রাখার জন্য উত্সাহ দিন, কেবল কারণ এটি কোয়েরি সরঞ্জামটিতে এক সময় দেখা গিয়েছিল
জোয়েল কোহোর্ন

3
এমনকি আমি এটি একাধিকবার বাগ হিসাবে দেখেছি।
dkretz

6
মাইএসকিউএলে, এটি বাছাই করার জন্য নথিভুক্ত করা হয়। < dev.mysql.com/doc/refman/5.0/en/select.html >। সুতরাং মাইএসকিউএলকে দোষ দিন (আবার)।
ডার্বোবার্ট

1
ওরাকল-এ, অসংরক্ষিত ফলাফল (প্রায়) সর্বদা গ্রুপিংয়ের সাথে মিলছে - সংস্করণ 10 জি পর্যন্ত। বিকাশকারীদের জন্য প্রচুর পুনর্নির্মাণ যারা অর্ডারটি ছেড়ে দিয়েছিল!
টনি অ্যান্ড্রুজ

1
আমি এমনকি একটি প্রশিক্ষণ ক্লাসে ছিলাম যেখানে এটি এসকিউএল সার্ভারের জন্য সত্য হিসাবে বর্ণনা করা হয়েছিল। আমাকে খুব জোরে প্রতিবাদ করতে হয়েছিল। কেবলমাত্র 20 টি অক্ষর টাইপ করার জন্য সঞ্চয় করার জন্য আপনি অস্পষ্ট বা অননুমোদিত আচরণের উপর নির্ভর করেন।
এরিক্ক্যালেন

20
SELECT FirstName + ' ' + LastName as "Full Name", case UserRole when 2 then "Admin" when 1 then "Moderator" else "User" end as "User's Role", case SignedIn when 0 then "Logged in" else "Logged out" end as "User signed in?", Convert(varchar(100), LastSignOn, 101) as "Last Sign On", DateDiff('d', LastSignOn, getDate()) as "Days since last sign on", AddrLine1 + ' ' + AddrLine2 + ' ' + AddrLine3 + ' ' + City + ', ' + State + ' ' + Zip as "Address", 'XXX-XX-' + Substring(Convert(varchar(9), SSN), 6, 4) as "Social Security #" FROM Users

বা, সবকিছুকে এক লাইনে ক্র্যামিং করা।


একটি পূর্ববর্তী মন্তব্যের ক্যোয়ারী ব্যবহৃত হয়েছিল, কারণ এটি ছিল আমার প্রথম এসকিউএল-বিবৃতি available
জ্যাস্পার বেকার্স

17
  • FROM TableA, TableB WHEREজন্য সিনট্যাক্স বদলে যোগদান করেFROM TableA INNER JOIN TableB ON

  • অনুমান করা যে কোনও ক্যোয়ারী একটি অর্ডারের মাধ্যমে একটি অনুচ্ছেদে অর্ডার না দিয়ে নির্দিষ্ট উপায়ে সাজানো হবে, কারণ এটিই ক্যোয়ারী সরঞ্জামটিতে পরীক্ষার সময় প্রদর্শিত হয়েছিল।


5
আমার ওরাকল ডিবিএ সর্বদা অভিযোগ করে যে আমি "এএনএসআই যোগ দেয়", অর্থাৎ আপনি যা সঠিক উপায়ে উপস্থাপন করেন তা ব্যবহার করি। তবে আমি এটি চালিয়ে যাচ্ছি এবং আমার সন্দেহ হয় যে তারা গভীরভাবে তারা এটি আরও ভাল জানেন।
স্টিভ ম্যাকলিউড

1
আমার সন্দেহ হয় যে ওরাকল চান স্ট্যান্ডার্ড এসকিউএল চলে যাবে। :-) এছাড়াও, আপনি মাইএসকিউএল 5 এ অন্তর্নিহিত এবং সুস্পষ্ট জোয়ানস (ওরফে এএনএসআই যোগ) মিশ্রিত করতে পারবেন না - এটি কাজ করে না। সুস্পষ্ট জেওএনগুলির জন্য এটি অন্য যুক্তি।
স্ট্যাটিক্সান

3
আমি বলব যে এমনকি একটি অন্তর্ভুক্ত বি বি একটি বিরোধী নিদর্শন। আমি একটি অভ্যন্তরীণ বি ব্যবহার পছন্দ করি।
জন নিলসন

ওরাকল এখন এএনএসআই সিনট্যাক্স সমর্থন করে তবে অতীতে বাইরের যোগদানের জন্য তাদের কাছে এই সত্যই অদ্ভুত বাক্য গঠন ছিল এবং এখনও অনেক বেশি লোক এটি ব্যবহার করছে।
Cervo

ভাল ... ওরাকল এখনও আপনাকে এএনএসআই ব্যবহার করতে পারবেন না তাড়াতাড়ি রিফ্রেশেবল, অন-কমিট ম্যাটেরিয়াল ভিউ
গের্যাট

14

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

উইন্ডো ফাংশন, সমষ্টিগত ফাংশনগুলির মতো, সারিগুলির একটি সংজ্ঞায়িত সেট (একটি গ্রুপ) এ একটি সমষ্টি সম্পাদন করে, তবে প্রতি গ্রুপে একটি করে মান ফেরানোর পরিবর্তে উইন্ডো ফাংশন প্রতিটি গোষ্ঠীর একাধিক মান প্রদান করতে পারে।

উইন্ডোটিং ফাংশনগুলির একটি সুন্দর ওভারভিউয়ের জন্য ও'রিলি এসকিউএল কুকবুক পরিশিষ্ট দেখুন ।


12

তালিকাটি সম্পূর্ণ করার জন্য আমার নিজের বর্তমান প্রিয়টি এখানে রাখতে হবে। আমার প্রিয় অ্যান্টিপ্যাটার্ন আপনার প্রশ্নের পরীক্ষা করছে না

এটি প্রযোজ্য যখন:

  1. আপনার প্রশ্নের একাধিক টেবিল জড়িত।
  2. আপনি মনে করেন আপনার কাছে ক্যোয়ারির জন্য একটি অনুকূল নকশা রয়েছে তবে আপনার অনুমানগুলি পরীক্ষা করার জন্য বিরক্ত করবেন না।
  3. আপনি যে প্রথম ক্যোয়ারীটি কাজ করে তা গ্রহণ করেন, এটি অপ্টিমাইজডের কাছাকাছি কিনা কিনা তা সম্পর্কে কোনও ধারণা ছাড়াই।

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


ন্যূনতম টি-এসকিউএল পরীক্ষার জন্য খুব কার্যকর কৌশল: আপনি যখন এসপি, ইউডিএফ ইত্যাদির সংজ্ঞা দেন সেখানে। এসকিউএল ফাইলে, আইএফ 1 = 2 বিগিনের মতো একটি ব্লক পরীক্ষা তৈরি করার পরে (প্রত্যাশিত ফলাফল সহ আপনার কোডের জন্য নমুনা কেস) মন্তব্য হিসাবে) সমাপ্তি
জো পাইনেদা

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

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

11

অস্থায়ী টেবিল অপব্যবহার।

বিশেষত: এই ধরণের জিনিস:

SELECT personid, firstname, lastname, age
INTO #tmpPeople
FROM People
WHERE lastname like 's%'

DELETE FROM #tmpPeople
WHERE firstname = 'John'

DELETE FROM #tmpPeople
WHERE firstname = 'Jon'

DELETE FROM #tmpPeople
WHERE age > 35

UPDATE People
SET firstname = 'Fred'
WHERE personid IN (SELECT personid from #tmpPeople)

আপনার প্রয়োজন নেই এমন সারিগুলি মুছতে কেবল কোনও ক্যোয়ারী থেকে অস্থায়ী টেবিল তৈরি করবেন না।

এবং হ্যাঁ, আমি প্রোডাকশন ডিবিতে এই ফর্মটিতে কোডের পৃষ্ঠাগুলি দেখেছি।


1
+1, আমি সম্মত যদিও, আমি কমপক্ষে একটি বা দুটি ক্ষেত্রে খুঁজে পেয়েছি যেখানে এই কৌশলটির কার্যকারিতা উন্নতি হয়েছে - জড়িত প্রশ্নগুলি কমপক্ষে বলা জটিল ছিল।
a'r

1
সত্য - তাদের একটি জায়গা রয়েছে, কেবল প্রতিটি প্রশ্নের মধ্যে নয় :)
geofftnz

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

9

কনট্রেরিয়ান ভিউ: সাধারণীকরণের সাথে অতিরিক্ত-আবেশ।

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

আমি খুঁজে পেয়েছি যে ওভার-নরমালাইজড সিস্টেমগুলি প্রায়শই অকালীন অপটিমাইজেশন হয়, বিশেষত প্রাথমিক বিকাশের পর্যায়ে।

(এতে আরও চিন্তাভাবনা ... http://writeonly.wordpress.com/2008/12/05/simple-object-db- using-json-and-python-sqlite/ )


22
আমি মনে করি অ-নরমালাইজেশন প্রায়শই অকালীন অপটিমাইজেশন।
tuinstoel

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

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

জেএসএন ফর্ম্যাটে যৌগিক ডেটা সংরক্ষণ করা একটি জিনিস: এর জন্য আরও এবং আরও বেশি সমর্থন রয়েছে এবং এটি সচেতন ট্রেড অফ। একটি যোগ দেওয়ার সংরক্ষণের প্রয়াসে কমা-বিচ্ছিন্ন (বা যা কিছু) মান ব্যবহার করা অর্থ-বুদ্ধিমান এবং পাউন্ড-বোকা।
জন কোয়ান

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

9

আমি কেবলমাত্র এটি একসাথে রেখেছি, এসও-তে এখানে কিছু এসকিউএল প্রতিক্রিয়াগুলির ভিত্তিতে।

ইভেন্ট হ্যান্ডলারগুলি ওওপি হিসাবে ট্রিগাররা ডেটাবেজে হ'ল এটি ভাবা একটি গুরুতর প্রতিরোধক। এই ধারণাটি রয়েছে যে কোনও টেবিলে কোনও লেনদেন (ইভেন্ট) হওয়ার পরে কেবল কোনও পুরানো যুক্তি ট্রিগারগুলিতে ফেলে দেওয়া হতে পারে, বরখাস্ত করা যায়।

সত্য না. বড় পার্থক্যগুলির মধ্যে একটি হ'ল ট্রিগারগুলি সিঙ্ক্রোনাস হয় - একটি প্রতিহিংসা সহকারে, কারণ তারা একটি সারি ক্রিয়াকলাপে নয়, একটি সেট অপারেশনে সিঙ্ক্রোনাস। ওওপি দিকে, ঠিক বিপরীত - ইভেন্টগুলি অ্যাসিক্রোনাস লেনদেন বাস্তবায়নের কার্যকর উপায়।


8

কোনও মন্তব্য ছাড়াই সঞ্চিত পদ্ধতি বা কার্যাদি ...


এবং দর্শনগুলি;) কার্যগুলি টেবিলের মূল্যবান ফাংশনগুলি (প্যারামিটার সহ = দর্শন) ব্যতীত সত্য।
স্টিফান স্টেইগার

7

1) আমি জানি না এটি একটি "অফিসিয়াল" অ্যান্টি-প্যাটার্ন, তবে আমি পছন্দ করি না এবং একটি ডাটাবেস কলামে ম্যাজিক মান হিসাবে স্ট্রিং লিটারালগুলি এড়ানোর চেষ্টা করি।

মিডিয়াউইকের টেবিলের 'চিত্র' থেকে একটি উদাহরণ:

img_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", 
    "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
img_major_mime ENUM("unknown", "application", "audio", "image", "text", 
    "video", "message", "model", "multipart") NOT NULL default "unknown",

(আমি কেবল বিভিন্ন কেসিংয়ের বিষয়টি লক্ষ্য করেছি, এড়াতে অন্য জিনিস)

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

2) তারিখ / স্ট্রিং রূপান্তর যা নির্দিষ্ট এনএলএস সেটিংসের উপর নির্ভর করে

CONVERT(NVARCHAR, GETDATE())

বিন্যাস শনাক্তকারী ছাড়া


এবং কোনও সিন্টেক্সটিকাল ইন্ডেন্টেশনও নয়। Argghh।
dkretz

2
কেন এই খারাপ? অবশ্যই যদি আপনি মানগুলির একটি সেট প্রকাশ করার চেষ্টা করছেন তবে এটি ঠিক তেমনি একটি সন্ধানের টেবিলের মতো কাজ করে এবং কোডটি কল করে এমন কোডের সাথে আরও ভাল ফিট করে। আইডির পরিবর্তে আমার অ্যাপ্লিকেশন কোডটিতে এমন একটি এনাম রয়েছে যা আমার ডিবিতে একটি এনাম সীমাবদ্ধতার সাথে আমার অ্যাপ্লিকেশন কোডের একটি এনামের চেয়ে মানচিত্র করে যা কোনও সন্ধানের সারণির নির্দিষ্ট সারিগুলিতে ম্যাপ করে। এটি কেবল ক্লিনার অনুভব করে।
জ্যাক রায়ান

@ জ্যাকআরয়ান: এটি খারাপ কারণ আপনি যখন পরে এনাম তালিকাটি পরিবর্তন করবেন তখন আপনার এখন দুটি জায়গায় পরিবর্তন করা উচিত remember এটি ডিআরওয়াই লঙ্ঘন করে । ডাটাবেসটি সত্যের একক উত্স হওয়া উচিত।
Gerrat

7

একটি ক্যোয়ারিতে আইডেন্টিকাল সাবকোয়ারিগুলি।


10
দুর্ভাগ্যক্রমে, কখনও কখনও আপনি কেবল তা এড়াতে পারবেন না - এসকিউএল 2000 এ কোনও "উইথ" কীওয়ার্ড ছিল না, এবং সাধারণ সাবকোয়ারিগুলিকে আবদ্ধ করতে ইউডিএফ ব্যবহার করে কোনও সময় পারফরম্যান্সের শাস্তি হয়, এমএসকে দোষ দেয় ...
জো পাইনেদা

ঠিক আছে, আশা করি তারা এই দিনগুলির মধ্যে এটি যোগ করার উপক্রম করবে।
এভিলটিচ

এসকিউএল 2000 এ আপনি টেবিল ভেরিয়েবল ব্যবহার করতে পারেন।
পুনরাবৃত্ত

@ রিসার্সিভ: আপনার কোনও টেবিলের ভেরিয়েবলে সূচি থাকতে পারে না, যা প্রায়শই এটি সাবকিউয়ের চেয়ে ধীর করে দেয়। তবে আপনি কাস্টম সূচকগুলি সহ একটি অস্থায়ী টেবিল ব্যবহার করতে পারেন।
রিক

শীতল, এসকিউএল এর সাথে বছরের পর বছর ধরে কাজ করে যাচ্ছিল, এবং সাধারণ টেবিল এক্সপ্রেশনও উপস্থিত ছিল তা জানত না (যদিও তাদের আমার প্রয়োজন হত)। এখন আমি করি! ধন্যবাদ!
sleske

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

  • দ্য প্যারামেড - একটি প্রশ্নের একাধিক উদ্দেশ্য থাকতে পারে? সম্ভবত তবে পরবর্তী ব্যক্তি যিনি এটি পড়েন তিনি গভীর ধ্যানের আগ পর্যন্ত জানেন না। আপনার এখনই তাদের প্রয়োজন না হলেও এমনকি ডিবাগ করার জন্য "স্রেফ" হলেও আপনার সম্ভাবনা রয়েছে will পরামিতি যুক্ত করা রক্ষণাবেক্ষণের সময়কে হ্রাস করে এবং জিনিসগুলি DRY রাখে। আপনার যদি কোনও ক্লজ থাকে তবে আপনার পরামিতি থাকা উচিত।

  • কোনও সিএসই-র জন্য মামলা নয় -

    SELECT  
    CASE @problem  
      WHEN 'Need to replace column A with this medium to large collection of strings hanging out in my code.'  
        THEN 'Create a table for lookup and add to your from clause.'  
      WHEN 'Scrubbing values in the result set based on some business rules.'  
        THEN 'Fix the data in the database'  
      WHEN 'Formating dates or numbers.'   
        THEN 'Apply formating in the presentation layer.'  
      WHEN 'Createing a cross tab'  
        THEN 'Good, but in reporting you should probably be using cross tab, matrix or pivot templates'   
    ELSE 'You probably found another case for no CASE but now I have to edit my code instead of enriching the data...' END  

তৃতীয়টি পছন্দ। আমি ইতিমধ্যে এটি স্থানীয়ভাবে ব্যবহার করছি ...
alphadogg

প্রপস জন্য ধন্যবাদ। :)
জেসন সাল্ডো

5

দু'টি আমি সর্বাধিক সন্ধান করি এবং পারফরম্যান্সের দিক থেকে উল্লেখযোগ্য ব্যয় থাকতে পারে:

  • একটি সেট ভিত্তিক এক্সপ্রেশন পরিবর্তে কার্সার ব্যবহার। আমি অনুমান করি প্রোগ্রামারটি পদ্ধতিগতভাবে চিন্তা করার সময় এটি প্রায়শই ঘটে।

  • সহ-সম্পর্কিত সাব-কোয়েরিগুলি ব্যবহার করে, যখন কোনও উত্তোলিত টেবিলের সাথে যোগ দেওয়া কাজটি করতে পারে।


আমি আপনাকে যা বলে মনে করি তার অর্থ যদি বোঝাতে চাই তবে আমি সম্মত; যদিও একটি সহযোগিত সাব-কোয়েরি হ'ল এক ধরণের উত্সযুক্ত টেবিল IIRC।
dkretz

1
একটি উত্সযুক্ত টেবিলটি একটি সেট অপারেশন, যেখানে একটি সম্পর্কিত সম্পর্কীয় subquery বাইরের ক্যোয়ারীতে প্রতিটি সারির জন্য চালিত হয়, এটি কম দক্ষ করে তোলে (10 এর মধ্যে 9 বার)
মিচ গম

কয়েক বছর আগে আমি আমার অবাক করে দিয়েছি যে এসকিউএল এস কোনওভাবেই সম্পর্কিত সম্পর্কিত প্রশ্নগুলি পরিচালনা করার জন্য অনুকূলিত হয়েছে: সাধারণগুলির জন্য আপনি একটি যুক্তিসঙ্গতভাবে সমতুল্য ক্যোয়ারির সাথে একইভাবে কার্যকর করার পরিকল্পনাটি যোগদান করুন! এছাড়াও, সম্পর্কযুক্ত প্রশ্নগুলি যা ওরাকলকে তার হাঁটুর কাছে নিয়ে আসে কেবল এসকিউএল এস-তে ধীরে ধীরে চলে!
জো পাইনেদা

সে কারণেই আমি সর্বদা এটি উভয় উপায়েই পরীক্ষা করি। এবং আমি <i> করি </> এটি উভয়ভাবেই চেষ্টা করে দেখি। অনুশীলনে, যাইহোক এসকিউএল সার্ভারের জন্য, আমি সাধারণত সংযুক্ত বর্গটি কোনও ধীর গতিতে খুঁজে পাইনি।
dkretz

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

5

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


5

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

  • শারীরিক I / O মিনিমাইজেশন কৌশলগুলি প্রদত্ত যে সর্বাধিক প্রশ্নের 'বাধা হ'ল I / O সিপিইউ নয়
  • বিভিন্ন ধরণের শারীরিক স্টোরেজ অ্যাক্সেসের পারফেক্ট ইফেক্ট (উদাহরণস্বরূপ প্রচুর অনুক্রমিক I / O প্রচুর ছোট এলোমেলো I / O এর চেয়ে দ্রুত হবে যদিও আপনার শারীরিক স্টোরেজটি যদি এসএসডি হয় তবে কম!)
  • ডিবিএমএস যদি একটি দুর্বল কোয়েরি প্ল্যান উত্পন্ন করে তবে কীভাবে কোনও ক্যোয়ারিকে হ্যান্ড-টিউন করবেন
  • কীভাবে দুর্বল ডাটাবেস পারফরম্যান্স নির্ণয় করা যায়, ধীর ক্যোয়ারিটি কীভাবে "ডিবাগ" করা যায় এবং কীভাবে কোনও প্ল্যান পড়তে হয় (বা আপনার পছন্দসই ডিবিএমএসের উপর নির্ভর করে ব্যাখ্যা করুন)
  • মাল্টি-ইউজার অ্যাপ্লিকেশনগুলিতে থ্রুটপুটটি অনুকূলিতকরণ এবং ডেডলকগুলি এড়াতে লক করার কৌশলগুলি
  • ডেটা সেটগুলির প্রসেসিং পরিচালনা করতে ব্যাচিং এবং অন্যান্য কৌশলগুলির গুরুত্ব
  • সারণী এবং সূচক নকশা সেরা ব্যালেন্স স্পেস এবং পারফরম্যান্সের জন্য (যেমন সূচকগুলি আচ্ছাদন করা, যেখানে সূচিগুলি সম্ভব সেখানে ছোট রাখা, প্রয়োজনীয় ডাটা ন্যূনতম আকারে হ্রাস করা ইত্যাদি)

3

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

DECLARE c1 CURSOR FOR SELECT Col1, Col2, Col3 FROM Table1

FOREACH c1 INTO a.col1, a.col2, a.col3
    DECLARE c2 CURSOR FOR
        SELECT Item1, Item2, Item3
            FROM Table2
            WHERE Table2.Item1 = a.col2
    FOREACH c2 INTO b.item1, b.item2, b.item3
        ...process data from records a and b...
    END FOREACH
END FOREACH

সঠিক সমাধান (প্রায় সবসময়) হ'ল দুটি নির্বাচনী বিবৃতি একের মধ্যে একত্রিত করা:

DECLARE c1 CURSOR FOR
    SELECT Col1, Col2, Col3, Item1, Item2, Item3
        FROM Table1, Table2
        WHERE Table2.Item1 = Table1.Col2
        -- ORDER BY Table1.Col1, Table2.Item1

FOREACH c1 INTO a.col1, a.col2, a.col3, b.item1, b.item2, b.item3
    ...process data from records a and b...
END FOREACH

ডাবল লুপ সংস্করণটির একমাত্র সুবিধা হ'ল আপনি টেবিল 1 এ মানগুলির মধ্যে বিরতিগুলি সহজেই স্পট করতে পারেন কারণ অভ্যন্তরীণ লুপটি শেষ হয়। এটি নিয়ন্ত্রণ-বিরতির রিপোর্টের একটি কারণ হতে পারে।

এছাড়াও, অ্যাপ্লিকেশন অনুসারে বাছাই করা সাধারণত একটি নং হয়।


শৈলী, যদিও এই সিনট্যাক্সটি নয়, আমার অভিজ্ঞতায় পিএইচপি বিশেষত প্রসারিত।
dkretz

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

আপনি আপনার অ্যান্টিপ্যাটার্ন চিত্রিত করার জন্য একটি সুপরিচিত অ্যান্টিপ্যাটার্ন (অন্তর্নিহিত যোগ দিয়ে) ব্যবহার করছেন তা বাদ ব্যতীত, বিন্দুটিকে পরাস্ত করে।
জোহান

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

3

রেকর্ড ঠিকানাগুলির জন্য সরোজেট হিসাবে প্রাথমিক কীগুলি ব্যবহার করা এবং রেকর্ডগুলিতে এম্বেড থাকা পয়েন্টারগুলির জন্য একটি বিদেশী কী ব্যবহার করা।

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