কোনও মান সংরক্ষণের উপযুক্ত উপায় যা একাধিক বিভিন্ন ধরণের হতে পারে


11

আমার কাছে একটি উত্তর সারণী এবং একটি প্রশ্ন সারণী রয়েছে।

উত্তর টেবিল একটি মান আছে, কিন্তু প্রশ্ন উপর নির্ভর করে, এই মান একটি হতে পারে bit, nvarcharঅথবা number(এখন পর্যন্ত)। প্রশ্ন কি তার অভিপ্রেত উত্তর মান টাইপ হওয়া উচিত একটি ধারণা হয়েছে।

এই উত্তরগুলির মানগুলি এক পর্যায়ে বা অন্য সময়ে পার্স করা গুরুত্বপূর্ণ , যেহেতু সংখ্যার কমপক্ষে তুলনা করা দরকার।

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

আমি দু'টি বিকল্প বিবেচনা করেছি:

উ: এক্সএমএল বা স্ট্রিং যা লক্ষ্যযুক্ত ধরণের উপর নির্ভর করে আলাদাভাবে পার্স হয় (যা প্রশ্নের মধ্যে ট্র্যাক রাখা থাকে)

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

গ। উত্তর টেবিলের তিনটি পৃথক কলাম যা অভিপ্রায়িত ধরণের ভিত্তিতে পুনরুদ্ধার করা যায়।

আমি এই পদ্ধতির পক্ষে বা কনসপন্যাসের জন্য কিছু বিকল্প ইনপুট পেতে বা বিকল্প বিবেচনা না করায় খুশি হব।

উত্তর:


2

এটি আপনার ফ্রন্ট-এন্ড ডেটা অ্যাক্সেস করে কীভাবে তা নির্ভর করে।

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

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

বিকল্পভাবে আপনি প্রতি মান প্রকারে একটি কলাম ব্যবহার করতে পারেন। আমাদের আজ টেরাবাইট ড্রাইভ!

একটি এক্সএমএল কলাম সম্ভব, তবে সম্ভবত সাধারণ পাঠ্য কলামের তুলনায় আরও জটিলতা যুক্ত করে এবং একই জিনিসটি করে, যাকে নাম সিরিয়ালাইজিং / ডিসরিয়ালাইজিং।

পৃথক পৃথক যোগদানের টেবিলগুলি জিনিসগুলি করার সঠিক স্বাভাবিক উপায়; তবে এগুলি পাশাপাশি কিছুটা জটিলতাও যুক্ত করে।

সহজবোধ্য রাখো.

আরও দেখুন আমার উত্তর করতে প্রশ্নাবলী ডাটাবেসের ডিজাইন - কোন পথে উত্তম?


4

আপনি যা বলেছেন তার ভিত্তিতে আমি নিম্নলিখিত সাধারণ স্কিমা ব্যবহার করব:

CREATE TABLE [dbo].[PollQuestion]
(
    [PollQuestionId] INT NOT NULL PRIMARY KEY IDENTITY,
    [QuestionText] NVARCHAR(150) NOT NULL, -- Some reasonable character limit
    [Created] DATETIME2(2) NOT NULL DEFAULT SYSUTCDATETIME(),
    [Archived] DATETIME2(2) NULL,  -- Remove this if you don't need to hide questions
)
CREATE TABLE [dbo].[PollOption]
(
    [PollOptionId] INT NOT NULL PRIMARY KEY IDENTITY,
    [PollQuestionId] INT NOT NULL,  -- Link to the question here because options aren't shared across questions
    [OptionText] NVARCHAR(50) NOT NULL, -- Some reasonable character limit
    [Created] DATETIME2(2) NOT NULL DEFAULT SYSUTCDATETIME(),
    [Archived] DATETIME2(2) NULL  -- Remove this if you don't need to hide options

    CONSTRAINT [FK_PollOption_PollQuestionId_to_PollQuestion_PollQuestionId] FOREIGN KEY ([PollQuestionId]) REFERENCES [dbo].[PollQuestion]([PollQuestionId])
)
CREATE TABLE [dbo].[PollResponse]
(
    [PollResponseId] INT NOT NULL PRIMARY KEY IDENTITY,
    [PollOptionId] INT NOT NULL,
    [UserId] INT NOT NULL,
    [Created] DATETIME2(2) NOT NULL DEFAULT SYSUTCDATETIME(),
    [Archived] DATETIME2(2) NULL,  -- Remove this if you don't need to hide answers

    CONSTRAINT [FK_PollResponse_PollOptionId_to_PollOption_PollOptionId] FOREIGN KEY ([PollOptionId]) REFERENCES [dbo].[PollOption]([PollOptionId]),
    CONSTRAINT [FK_PollResponse_UserId_to_User_UserId] FOREIGN KEY ([UserId]) REFERENCES [dbo].[User]([UserId])
)

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

প্রশ্ন এবং সম্ভাব্য উত্তরগুলি প্রথম ব্যবহারকারীর কাছ থেকে সংগ্রহ করা হবে এবং PollQuestion এবং PollOption টেবিলগুলিতে .োকানো হবে। দ্বিতীয় ব্যবহারকারী যিনি প্রশ্নের উত্তর দেন উত্তরের একটি তালিকা (সত্য / মিথ্যা = 2 টির তালিকা) থেকে নির্বাচন করবেন। তারা তৈরি করা প্রশ্নগুলি ট্র্যাক করার জন্য উপযুক্ত হলে নির্মাতার ব্যবহারকারীর আইডি অন্তর্ভুক্ত করতে আপনি PollQuestion টেবিলটি প্রসারিত করতে পারেন।

আপনার ইউআইতে ব্যবহারকারী উত্তরটি নির্বাচন করে তা PollOptionId মানের সাথে বেঁধে দেওয়া যেতে পারে। PollQuestionId একসাথে আপনি যাচাই করতে পারেন যে উত্তরটি প্রশ্নের জন্য দ্রুত বৈধ। তাদের প্রতিক্রিয়া বৈধ হলে পোলআরস্পোন সারণিতে প্রবেশ করা হবে।

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

CREATE TABLE [dbo].[PollResponse]
(
    [PollResponseId] INT NOT NULL PRIMARY KEY IDENTITY,
    [PollOptionId] INT NULL,
    [PollQuestionId] INT NOT NULL,
    [UserId] INT NOT NULL,
    [AlternateResponse] NVARCHAR(50) NULL, -- Some reasonable character limit
    [Created] DATETIME2(2) NOT NULL DEFAULT SYSUTCDATETIME(),
    [Archived] DATETIME2(2) NULL,  -- Remove this if you don't need to hide answers

    CONSTRAINT [FK_PollResponse_PollOptionId_to_PollOption_PollOptionId] FOREIGN KEY ([PollOptionId]) REFERENCES [dbo].[PollOption]([PollOptionId]),
    CONSTRAINT [FK_PollResponse_UserId_to_User_UserId] FOREIGN KEY ([UserId]) REFERENCES [dbo].[User]([UserId])
)

আপনার প্রয়োজনের উপর নির্ভর করে কোনও বিকল্প সরবরাহ করা হয়েছে বা বিকল্প প্রতিক্রিয়া দেওয়া হয়েছে তা নিশ্চিত করার জন্য আমি সম্ভবত একটি চেক বাধাও যুক্ত করব।

সম্পাদনা করুন: অল্টারনেটরেসপনসের জন্য ডেটাটাইপ যোগাযোগ করা

একটি নিখুঁত বিশ্বে আমরা জেনেরিক্সের ধারণাটি AlternateReponse এর জন্য বিভিন্ন ডেটাটাইপগুলি পরিচালনা করতে পারি। হায়রে আমরা নিখুঁত বিশ্বে বাস করি না। আমি যে সর্বোত্তম সমঝোতার কথা ভাবতে পারি তা হ'ল PollQuestion টেবিলের মধ্যে AlternateResponse ডেটাটাইপটি কী হওয়া উচিত তা নির্দিষ্ট করা এবং একটি বিকল্প হিসাবে ডেটাবেজে AlternateReponse সংরক্ষণ করা। নীচে আপডেট হওয়া প্রশ্ন স্কিমা এবং নতুন ডেটাটাইপ টেবিলটি রয়েছে:

CREATE TABLE [dbo].[PollQuestion]
(
    [PollQuestionId] INT NOT NULL PRIMARY KEY IDENTITY,
    [QuestionText] NVARCHAR(150) NOT NULL, -- Some reasonable character limit
    [QuestionDataTypeId] INT NOT NULL,
    [Created] DATETIME2(2) NOT NULL DEFAULT SYSUTCDATETIME(),
    [Archived] DATETIME2(2) NULL,  -- Remove this if you don't need to hide questions
    -- Insert FK here for QuestionDataTypeId
)
CREATE TABLE [dbo].[QuestionDataType]
(
    [QuestionDataTypeId] INT NOT NULL PRIMARY KEY IDENTITY,
    [Description] NVARCHAR(50) NOT NULL, -- Some reasonable character limit
)

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


0

কটাক্ষপাত আছে কি EAV সম্পর্কে তাই খারাপ, যাহাই হউক না কেন? EAV মডেল সম্পর্কে কিছু তথ্যের জন্য অ্যারন বার্ট্র্যান্ড লিখেছেন।

এক্সএমএল বা একাধিক টেবিল না রেখে প্রতিটি ডেটা টাইপের জন্য একটি কলাম থাকা সম্ভবত একাধিক উপায়ে আরও ভাল।

সীমাবদ্ধ অংশটি সহজ:

CHECK 
(
    CASE WHEN col1 IS NOT NULL THEN 1 ELSE 0 END + 
    CASE WHEN col2 IS NOT NULL THEN 1 ELSE 0 END + 
    CASE WHEN col3 IS NOT NULL THEN 1 ELSE 0 END = 1
)

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

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

অ্যারন বারট্র্যান্ডের দেওয়া প্রশ্নের মন্তব্যের ভিত্তিতে উত্তর


-1

আমি মনে করি সমস্যাটি অত্যধিক চিন্তাভাবনা করা হয়েছে বা কিছু অতিরিক্ত বাধা আছে কেন কিছু উত্তর আরও বেশি গ্রহণযোগ্য হতে পারে তবে অন্যরা। বর্তমানে এমন কোনও প্রমাণ নেই বলে মনে হয় যে উত্তরটি কোনওভাবেই ডিবি দ্বারা প্রক্রিয়া করতে হবে তবে কেবল লগ ফিল্ড হিসাবে।

আমি একটি এনভিসার্চার (ম্যাক্স) নিয়ে যাব এবং তারপরে সামগ্রী সঞ্চিত / পুনরুদ্ধারের সাথে সামনের চুক্তি করতে দেব। উত্তর সম্ভবত সঠিক হলে সম্ভবত একটি IS_CORRECT বিট ক্ষেত্র যেখানে সীমান্ত সঞ্চয় করতে পারে।

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