একটি নাল কলাম একটি প্রাথমিক কী এর অংশ হতে পারে?


15

আমি একটি এসকিউএল সার্ভার 2012 ডাটাবেস বিকাশ করছি এবং আমার ওয়ান-টু-জিরো-ও-ওয়ান সম্পর্ক সম্পর্কে একটি প্রশ্ন আছে।

আমার দুটি টেবিল আছে, Codesএবং HelperCodes। একটি কোড শূন্য বা একটি সহায়ক কোড থাকতে পারে। এই দুটি সারণী এবং তাদের সম্পর্কগুলি তৈরি করতে এটি স্কিল স্ক্রিপ্ট:

CREATE TABLE [dbo].[Code]
(
    [Id] NVARCHAR(20) NOT NULL, 
    [Level] TINYINT NOT NULL, 
    [CommissioningFlag] TINYINT NOT NULL, 
    [SentToRanger] BIT NOT NULL DEFAULT 0, 
    [LastChange] NVARCHAR(50) NOT NULL, 
    [UserName] NVARCHAR(50) NOT NULL, 
    [Source] NVARCHAR(50) NOT NULL, 
    [Reason] NVARCHAR(200) NULL, 
    [HelperCodeId] NVARCHAR(20) NULL,
    CONSTRAINT [PK_Code] PRIMARY KEY CLUSTERED
    (
        [Id] ASC
    ),
    CONSTRAINT [FK_Code_LevelConfiguration]
       FOREIGN KEY ([Level])
        REFERENCES [dbo].[LevelConfiguration] ([Level]),
    CONSTRAINT [FK_Code_HelperCode]
       FOREIGN KEY ([HelperCodeId])
        REFERENCES [dbo].[HelperCode] ([HelperCodeId])
)

CREATE TABLE [dbo].[HelperCode]
(
    [HelperCodeId] NVARCHAR(20) NOT NULL, 
    [Level] TINYINT NOT NULL, 
    [CommissioningFlag] TINYINT NOT NULL, 
    [LastChange] NVARCHAR(50) NOT NULL,
    CONSTRAINT [PK_HelperCode] PRIMARY KEY CLUSTERED
    (
        [HelperCodeId] ASC
    ),
    CONSTRAINT [FK_HelperCode_LevelConfiguration]
       FOREIGN KEY ([Level])
        REFERENCES [dbo].[LevelConfiguration] ([Level])
)

এটা কি ঠিক?

একটি কোড এবং একটি হেল্পার কোড দুটি পৃথক সত্তা। হেল্পার কোডটি কোনও ব্যবহৃত (কোনও কোডই এর উল্লেখ করে না) হতে পারে, বা ব্যবহৃত হতে পারে (কেবলমাত্র একটি কোডই এর উল্লেখ করে)।

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


1
আপনি কেন HelperCodeIdপিকে অংশ নিতে চান ? এটি কি কোনও সুযোগেই, কারণ আপনি একই হেল্পার কোডের রেফারেন্স দিতে দুই বা ততোধিক কোডগুলি প্রতিরোধ করতে চান?
অ্যান্ড্রি এম

হ্যাঁ, আমি সেই দুটি বা ততোধিক কোড একই হেল্পার কোডে রেফারেন্স করতে চাই। আর একটি বিকল্প HelperCodeIdকলামটি ইউনিক হিসাবে সেট করা ।
ভ্যানফ্যানেল

@ টাইপ्यूब আপনি উত্তর হিসাবে সম্পূর্ণ স্কয়ার বাক্য যুক্ত করতে পারেন? আমি স্কুএল নিয়ে খুব বেশি সময় কাজ করি না এবং আমি কীভাবে এটি করব তা জানি না। ধন্যবাদ।
ভ্যানসফ্যানেল

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

@ ওয়াল্টারমিট্টি আমি কখনই বুঝতে পারি নি যে কোনও পিকে নাল মান হওয়ায় কোনও আরডিবিএমএস যে মূল্য আনবে তা নষ্ট করবে। অনেকবার শুনেছি। তুমি কি বিস্তারিত বলতে পারো?
usr

উত্তর:


24

শিরোনামে প্রশ্নের উত্তর দিতে, না, সমস্ত প্রাথমিক কলাম থাকতে হবে NOT NULL

তবে টেবিলগুলির নকশাকে পরিবর্তন না করে আপনি Code (HelperCodeId)কলামে একটি ফিল্টারড সূচক যুক্ত করতে পারেন :

CREATE UNIQUE INDEX 
    FUX_Code_HelperCodeId
ON dbo.Code 
    (HelperCodeId) 
WHERE 
    HelperCodeId IS NOT NULL ;

WHERE HelperCodeId IS NOT NULLএসকিউএল-সার্ভার যেভাবে অনন্য বাধা এবং অনন্য সূচকে নাল ব্যবহার করে তার জন্য ফিল্টারটি ( ) দরকার needed ফিল্টার ছাড়া, এসকিউএল-সার্ভারটি একাধিক সারির সাথে প্রবেশের অনুমতি দেয় NULLনা HelperCodeId


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

CREATE TABLE [dbo].[Code]
(
    [Id] NVARCHAR(20) NOT NULL, 
    [Level] TINYINT NOT NULL, 
    [CommissioningFlag] TINYINT NOT NULL, 
    [SentToRanger] BIT NOT NULL DEFAULT 0, 
    [LastChange] NVARCHAR(50) NOT NULL, 
    [UserName] NVARCHAR(50) NOT NULL, 
    [Source] NVARCHAR(50) NOT NULL, 
    [Reason] NVARCHAR(200) NULL, 
    -- 
    -- removed:   [HelperCodeId] NVARCHAR(20) NULL,
    -- 
    CONSTRAINT [PK_Code] PRIMARY KEY CLUSTERED
    (
        [Id] ASC
    ),
    CONSTRAINT [FK_Code_LevelConfiguration]
       FOREIGN KEY ([Level])
        REFERENCES [dbo].[LevelConfiguration] ([Level]),
) ;

HelperCode অপরিবর্তিত রয়ে গেছে:

CREATE TABLE [dbo].[HelperCode]
(
    [HelperCodeId] NVARCHAR(20) NOT NULL, 
    [Level] TINYINT NOT NULL, 
    [CommissioningFlag] TINYINT NOT NULL, 
    [LastChange] NVARCHAR(50) NOT NULL,
    CONSTRAINT [PK_HelperCode] PRIMARY KEY CLUSTERED
    (
        [HelperCodeId] ASC
    ),
    CONSTRAINT [FK_HelperCode_LevelConfiguration]
       FOREIGN KEY ([Level])
        REFERENCES [dbo].[LevelConfiguration] ([Level])
) ;

অতিরিক্ত সারণিতে দুটি কোড UNIQUE(বা একটি প্রাথমিক এবং একটি অনন্য) থাকবে যাতে প্রতিটি কোড (সর্বোচ্চ) একটি হেল্পার কোডের সাথে সম্পর্কিত এবং প্রতিটি হেলপার কোড একটি (সর্বাধিক) একটি কোডের সাথে সম্পর্কিত কিনা তা নিশ্চিত করতে। উভয় কলাম হবে NOT NULL:

CREATE TABLE [dbo].[Code_HelperCode]
(
    [CodeId] NVARCHAR(20) NOT NULL, 
    [HelperCodeId] NVARCHAR(20) NOT NULL, 
    CONSTRAINT [UQ_Code_HelperCode_CodeId]
       UNIQUE (CodeId),
    CONSTRAINT [UQ_Code_HelperCode_HelperCodeId]
       UNIQUE (HelperCodeId),
    CONSTRAINT [FK_HelperCode_Code]
       FOREIGN KEY ([CodeId])
        REFERENCES [dbo].[Code] ([Id]),
    CONSTRAINT [FK_Code_HelperCode]
       FOREIGN KEY ([HelperCodeId])
        REFERENCES [dbo].[HelperCode] ([HelperCodeId])
) ;

ধন্যবাদ, আপনি চাইলে ডিজাইনের পরিবর্তন করতে পারেন। আমি অনেক কিছু শিখতে পারি।
ভ্যানসফ্যানেল

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

0

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

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

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

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