Supertype / উপপ্রকার
সুপার টাইপ / সাব টাইপ প্যাটার্নটি কীভাবে সন্ধান করবেন? সাধারণ কলামগুলি পিতামাতার টেবিলে যায়। প্রতিটি স্বতন্ত্র প্রকারের নিজস্ব পিকেট হিসাবে পিতামাতার আইডির সাথে নিজস্ব টেবিল থাকে এবং এতে অনন্য কলাম রয়েছে যা সমস্ত উপ টাইপের মধ্যে সাধারণ নয়। প্রতিটি ডিভাইস একাধিক সাব-টাইপ হতে পারে না তা নিশ্চিত করতে আপনি উভয় পিতামাতার এবং শিশুদের টেবিলগুলিতে একটি টাইপ কলাম অন্তর্ভুক্ত করতে পারেন। বাচ্চাদের এবং পিতামাতার মধ্যে (আইটেমআইডি, আইটেমটাইপআইডি) মধ্যে এফকে করুন। আপনি অন্য কোথাও পছন্দসই সততা বজায় রাখতে সুপার টাইপ বা সাব টাইপ টেবিলগুলিতে এফকে ব্যবহার করতে পারেন। উদাহরণস্বরূপ, যদি কোনও প্রকারের আইটেমআইডি অনুমোদিত হয় তবে পিতামতী সারণিতে এফকে তৈরি করুন। যদি কেবল সাবআইটিটাইম 1 টি উল্লেখ করা যায় তবে সেই সারণিতে এফকে তৈরি করুন। আমি টাইপআইডি রেফারেন্সিং টেবিলের বাইরে রেখে যাব।
নামকরণ
যখন নামকরণের কথা আসে তখন আপনার কাছে দুটি পছন্দ থাকে যেমন আমি এটি দেখি (যেহেতু কেবল "আইডি" এর তৃতীয় পছন্দটি আমার মনে একটি শক্তিশালী বিরোধী ধরণ)। হয় প্যারেন্ট টেবিলের মতো সাব টাইপ কী আইটেমআইডি কল করুন বা এটিকে ডুহিকিকিআইডি-র মতো সাব টাইপের নাম বলুন। কিছু চিন্তাভাবনা এবং এর সাথে কিছু অভিজ্ঞতার পরে, আমি এটিকে ডুইকিকিআইডি বলার পক্ষে পরামর্শ দিই। এর কারণ হ'ল যদিও সাব টাইপ টেবিলটি সম্পর্কে সত্যই আইটেম (ডুইকিজির পরিবর্তে) ছদ্মবেশে বিভ্রান্তি থাকতে পারে, আপনি যখন ডুচিকি টেবিলে একটি এফকে তৈরি করেন তার তুলনায় এটি একটি সামান্য নেতিবাচক এবং কলামের নামগুলি না করে ম্যাচ!
EAV তে বা EAV- এ EAV ডাটাবেসের সাথে আমার অভিজ্ঞতা
যদি ইএভি হ'ল আপনাকে যা করতে হবে তা হ'ল, তবে আপনাকে যা করতে হবে তা হ'ল। তবে যদি তা না করতেন তবে আপনাকে যা করতে হবে?
আমি একটি EAV ডাটাবেস তৈরি করেছি যা একটি ব্যবসায় ব্যবহৃত হয়। Godশ্বরের ধন্যবাদ, ডেটাগুলির সেটটি ছোট (যদিও কয়েক ডজন আইটেমের ধরণ রয়েছে) সুতরাং কার্যকারিতা খারাপ নয়। ডাটাবেসে কয়েক হাজারের বেশি আইটেম থাকলে এটি খারাপ হবে! তদ্ব্যতীত, সারণীগুলি এত কঠোরভাবে ক্যোয়ারী রয়েছে। এই অভিজ্ঞতা আমাকে যদি সম্ভব হয় তবে ভবিষ্যতে EAV ডাটাবেসগুলি এড়াতে সত্যই আগ্রহী করে তুলেছে।
এখন, আমার ডাটাবেসে আমি একটি সঞ্চিত প্রক্রিয়া তৈরি করেছি যা বিদ্যমান এবং প্রতিটি উপ-টাইপের জন্য স্বয়ংক্রিয়ভাবে PIVOTed ভিউগুলি তৈরি করে। আমি কেবল অটোডুহিকি থেকে জিজ্ঞাসা করতে পারি। সাব টাইপগুলি সম্পর্কে আমার মেটাডেটাতে একটি "শর্টনাম" কলাম রয়েছে যাতে নামগুলির মধ্যে ব্যবহারের জন্য উপযুক্ত অবজেক্ট-নিরাপদ নাম রয়েছে। এমনকি আমি ভিউগুলি আপডেটযোগ্য করে তুলেছি! দুর্ভাগ্যক্রমে, আপনি তাদের যোগদানের ক্ষেত্রে আপডেট করতে পারবেন না, তবে আপনি তাদের কাছে ইতিমধ্যে বিদ্যমান সারিটি sertোকাতে পারেন, যা একটি আপডেটে রূপান্তরিত হবে। দুর্ভাগ্যক্রমে, আপনি কেবল কয়েকটি কলাম আপডেট করতে পারবেন না, কারণ আপনি যে কলামগুলি INSERT-to-আপডেট রূপান্তর প্রক্রিয়াটি দিয়ে আপডেট করতে চান তা দর্শানোর কোনও উপায় নেই: একটি NULL মান দেখতে "এই কলামটিকে NULL এ আপডেট করুন" বলে মনে হচ্ছে এমনকি আপনি "এই কলামটি একেবারেই আপডেট করবেন না" নির্দেশ করতে চেয়েছিলেন।
EAV ডাটাবেসটি ব্যবহার করা সহজ করার জন্য এই সমস্ত সাজসজ্জা সত্ত্বেও, এখনও আমি খুব সাধারণ অনুসন্ধানে এই মতামতগুলি ব্যবহার করি না কারণ এটি খুব কম। অনুসন্ধান শর্তগুলি পুরো Value
টেবিলের দিকে ফিরে ধাক্কা দেওয়া হয় না , সুতরাং ফিল্টারিংয়ের আগে সেই দৃশ্যের ধরণের সমস্ত আইটেমের একটি মধ্যবর্তী ফলাফল সেট তৈরি করতে হবে। সেকি। সুতরাং আমার সাথে অনেকগুলি, অনেকগুলি ক্যোয়ারী রয়েছে অনেকগুলি, অনেকগুলিতে যোগ দেয়, প্রত্যেকে আলাদা আলাদা মান পেতে বের হয়। তারা তুলনামূলকভাবে ভাল পারফরম্যান্স, কিন্তু ওচ! এখানে একটি উদাহরণ। যে এসপি এটি তৈরি করে (এবং এর আপডেট ট্রিগার) এটি একটি দৈত্য প্রাণী, এবং আমি এটি নিয়ে গর্বিত, তবে এটি আপনি বজায় রাখতে চেষ্টা করতে চান এমন কিছু নয়।
CREATE VIEW [dbo].[AutoModule]
AS
--This view is automatically generated by the stored procedure AutoViewCreate
SELECT
ElementID,
ElementTypeID,
Convert(nvarchar(160), [3]) [FullName],
Convert(nvarchar(1024), [435]) [Descr],
Convert(nvarchar(255), [439]) [Comment],
Convert(bit, [438]) [MissionCritical],
Convert(int, [464]) [SupportGroup],
Convert(int, [461]) [SupportHours],
Convert(nvarchar(40), [4]) [Ver],
Convert(bit, [28744]) [UsesJava],
Convert(nvarchar(256), [28745]) [JavaVersions],
Convert(bit, [28746]) [UsesIE],
Convert(nvarchar(256), [28747]) [IEVersions],
Convert(bit, [28748]) [UsesAcrobat],
Convert(nvarchar(256), [28749]) [AcrobatVersions],
Convert(bit, [28794]) [UsesDotNet],
Convert(nvarchar(256), [28795]) [DotNetVersions],
Convert(bit, [512]) [WebApplication],
Convert(nvarchar(10), [433]) [IFAbbrev],
Convert(int, [437]) [DataID],
Convert(nvarchar(1000), [463]) [Notes],
Convert(nvarchar(512), [523]) [DataDescription],
Convert(nvarchar(256), [27991]) [SpecialNote],
Convert(bit, [28932]) [Inactive],
Convert(int, [29992]) [PatchTestedBy]
FROM (
SELECT
E.ElementID + 0 ElementID,
E.ElementTypeID,
V.AttrID,
V.Value
FROM
dbo.Element E
LEFT JOIN dbo.Value V ON E.ElementID = V.ElementID
WHERE
EXISTS (
SELECT *
FROM dbo.LayoutUsage L
WHERE
E.ElementTypeID = L.ElementTypeID
AND L.AttrLayoutID = 7
)
) X
PIVOT (
Max(Value)
FOR AttrID IN ([3], [435], [439], [438], [464], [461], [4], [28744], [28745], [28746], [28747], [28748], [28749], [28794], [28795], [512], [433], [437], [463], [523], [27991], [28932], [29992])
) P;
আইটেমগুলির মধ্যে একাধিক পাথ থাকতে পারে (বিশেষত: মডিউল-> সার্ভার, মডিউল-> ক্লাস্টার-> সার্ভার, মডিউল-> ডিবিএমএস) এর মধ্যে সম্পর্কগুলি সন্ধান করতে বিশেষ মেটাডেটা থেকে অন্য সঞ্চিত পদ্ধতি দ্বারা স্বয়ংক্রিয়ভাবে উত্পাদিত দৃশ্যের এখানে রয়েছে's > সার্ভার, মডিউল-> ডিবিএমএস-> ক্লাস্টার-> সার্ভার):
CREATE VIEW [dbo].[Link_Module_Server]
AS
-- This view is automatically generated by the stored procedure LinkViewCreate
SELECT
ModuleID = A.ElementID,
ServerID = B.ElementID
FROM
Element A
INNER JOIN Element B
ON EXISTS (
SELECT *
FROM
dbo.Element R1
WHERE
A.ElementID = R1.ElementID1
AND B.ElementID = R1.ElementID2
AND R1.ElementTypeID = 38
) OR EXISTS (
SELECT *
FROM
dbo.Element R1
INNER JOIN dbo.Element R2 ON R1.ElementID2 = R2.ElementID1
WHERE
A.ElementID = R1.ElementID1
AND R1.ElementTypeID = 40
AND B.ElementID = R2.ElementID2
AND R2.ElementTypeID = 38
) OR EXISTS (
SELECT *
FROM
dbo.Element R1
INNER JOIN dbo.Element R2 ON R1.ElementID2 = R2.ElementID1
WHERE
A.ElementID = R1.ElementID1
AND R1.ElementTypeID = 38
AND B.ElementID = R2.ElementID2
AND R2.ElementTypeID = 3122
) OR EXISTS (
SELECT *
FROM
dbo.Element R1
INNER JOIN dbo.Element R2 ON R1.ElementID2 = R2.ElementID1
INNER JOIN dbo.Element C2 ON R2.ElementID2 = C2.ElementID
INNER JOIN dbo.Element R3 ON R2.ElementID2 = R3.ElementID1
WHERE
A.ElementID = R1.ElementID1
AND R1.ElementTypeID = 40
AND C2.ElementTypeID = 3080
AND R2.ElementTypeID = 38
AND B.ElementID = R3.ElementID2
AND R3.ElementTypeID = 3122
)
WHERE
A.ElementTypeID = 9
AND B.ElementTypeID = 17
হাইব্রিড পদ্ধতির
আপনার যদি একটি EAV ডাটাবেসের কিছু গতিশীল দিক থাকা আবশ্যক, আপনি মেটাডেটা তৈরির বিষয়টি বিবেচনা করতে পারেন যেমন আপনার কাছে এমন ডেটাবেস রয়েছে, তবে পরিবর্তে আসলে সুপারটাইপ / সাব টাইপ ডিজাইনের প্যাটার্নটি ব্যবহার করা। হ্যাঁ, আপনাকে নতুন সারণী তৈরি করতে হবে এবং কলামগুলি যুক্ত করতে হবে এবং সরিয়ে ফেলতে হবে mod তবে যথাযথ প্রাক-প্রক্রিয়াজাতকরণের (যেমন আমি আমার EAV ডাটাবেসের অটো ভিউগুলি দিয়েছিলাম) সাথে আপনার কাজ করার মতো টেবিলের মতো বাস্তব বস্তু থাকতে পারে। কেবলমাত্র, তারা আমার মতো অতুলনীয় হবে না এবং ক্যোরি অপ্টিমাইজার বেস টেবিলগুলিতে ধাক্কা মেরে ভবিষ্যদ্বাণী করতে পারে (পড়ুন: তাদের সাথে ভাল সম্পাদন করুন)। সুপারটাইপ টেবিল এবং সাব টাইপ টেবিলের মধ্যে কেবল একটির যোগ হবে। আপনার অ্যাপ্লিকেশনটি কী করণীয় তা আবিষ্কার করতে মেটাডেটা পড়ার জন্য সেট করা যেতে পারে (বা এটি কিছু ক্ষেত্রে স্বয়ংক্রিয়ভাবে উত্পন্ন ভিউগুলি ব্যবহার করতে পারে)।
অথবা, যদি আপনার উপ-প্রকারের একটি বহু-স্তরের সেট থাকে, তবে কয়েক জনই যোগ দেয়। মাল্টি-লেভেল বলতে আমি বোঝাতে চাইছি যখন কিছু উপ-প্রকারগুলি সাধারণ কলামগুলি ভাগ করে, তবে সবকটিই নয়, আপনি সেগুলির জন্য একটি সাব টাইপ টেবিল রাখতে পারেন যা নিজেই কয়েকটি অন্যান্য টেবিলের একটি সুপার টাইপ। উদাহরণস্বরূপ, আপনি যদি সার্ভার, রাউটার এবং প্রিন্টার সম্পর্কিত তথ্য সঞ্চয় করেন তবে "আইপি ডিভাইস" এর একটি মধ্যবর্তী সাব টাইপটি বোধগম্য হতে পারে।
আমি এই সাবধানতাটি দেব যে আমি এখনও এমন একটি হাইব্রিড সুপার টাইপ / সাব টাইপ ইএভি-মেটাটেবল-সজ্জিত ডাটাবেস তৈরি করতে পারি নি যেমন আমি এখানে বাস্তব পরামর্শ দেওয়ার চেষ্টা করছি to তবে আমি EAV এর সাথে যে সমস্যার মুখোমুখি হয়েছি তা ছোট নয় এবং আপনার ডেটাবেসটি বড় হতে চলেছে এবং কিছু উন্মত্ত ব্যয়বহুল বিশাল হার্ডওয়্যার ছাড়াই আপনি ভাল পারফরম্যান্স চান এমন কিছু করা সম্ভবত একটি পরম প্রয়োজন ।
আমার মতে, বাস্তব সাব টাইপ টেবিলগুলির ব্যবহার / সৃষ্টি / পরিবর্তনটি স্বয়ংক্রিয় করতে ব্যয় করা সময়টি শেষ পর্যন্ত সর্বোত্তম হবে would ডেটা দ্বারা চালিত নমনীয়তার উপর দৃষ্টি নিবদ্ধ করা ইএভি শব্দটিকে এত আকর্ষণীয় করে তোলে (এবং বিশ্বাস করুন যে আমি ভালোবাসি কিভাবে যখন কেউ আমাকে একটি উপাদান টাইপ-এ একটি নতুন বৈশিষ্ট্য জন্য অনুরোধ আমি 18 সম্পর্কে সেকেন্ডের মধ্যে যোগ করতে পারেন এবং তারা অবিলম্বে ওয়েব সাইটে ডেটা দেওয়ার শুরু করতে পারেন )। তবে নমনীয়তা একাধিক উপায়ে সম্পন্ন করা যায়! প্রাক প্রক্রিয়াজাতকরণ এটি করার আরেকটি উপায়। এটি এমন একটি শক্তিশালী পদ্ধতি যা খুব কম লোকই ব্যবহার করে, সম্পূর্ণ ডেটা-চালিত হওয়ার সুবিধা দেয় কিন্তু হার্ড-কোডেড হওয়ার পারফরম্যান্স।
(দ্রষ্টব্য: হ্যাঁ এই মতামতগুলি সত্যই এর মতো ফর্ম্যাট করা হয়েছে এবং পাইভটগুলির কাছে আপডেট ট্রিগার রয়েছে :) আপনার জন্য একটি নমুনা।)
ও ওয়ান মোর আইডিয়া
আপনার সমস্ত ডেটা একটি টেবিলের মধ্যে রাখুন। কলামগুলি জেনেরিক নাম দিন এবং তারপরে একাধিক উদ্দেশ্যে তাদের পুনরায় ব্যবহার / অপব্যবহার করুন। এগুলি সম্পর্কে বুদ্ধিমান নাম দেওয়ার জন্য মতামত তৈরি করুন। যখন উপযুক্ত-ডেটা-টাইপ অব্যবহৃত কলাম উপলব্ধ না হয় তখন কলামগুলি যুক্ত করুন এবং আপনার মতামত আপডেট করুন। আমার দৈর্ঘ্য সাব টাইপ / সুপার টাইপ সম্পর্কে সত্ত্বেও, এটি সেরা উপায় হতে পারে।