নকশার প্যাটার্ন - অনেকগুলি পিতামাতার সারণিগুলির মধ্যে একটি


13

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

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

দ্রষ্টব্য: ডিডিএলের নীচে এসকিউএল সার্ভারের জন্য তবে আমার প্রশ্নটি কোনও ডিবিএমএসের ক্ষেত্রে প্রযোজ্য।

সমাধান 1 - একাধিক নুলযোগ্য এফকেস

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

CREATE TABLE Product (
    ProductID    int identity(1,1) not null,
    CreateUTC    datetime2(7) not null,
     Name        varchar(100) not null
    CONSTRAINT   PK_Product Primary Key CLUSTERED (ProductID)
)
CREATE TABLE Customer (
    CustomerID  int identity(1,1) not null,
    CreateUTC   datetime2(7) not null,
     Name       varchar(100) not null
    CONSTRAINT  PK_Customer Primary Key CLUSTERED (CustomerID)
)
CREATE TABLE News (
    NewsID      int identity(1,1) not null,
    CreateUTC   datetime2(7) not null,
    Name        varchar(100) not null
    CONSTRAINT  PK_News Primary Key CLUSTERED (NewsID)
)

CREATE TABLE Alert (
    AlertID     int identity(1,1) not null,
    CreateUTC   datetime2(7) not null,
    ProductID   int null,
    NewsID      int null,
    CustomerID  int null,
    CONSTRAINT  PK_Alert Primary Key CLUSTERED (AlertID)
)

ALTER TABLE Alert WITH CHECK ADD CONSTRAINT CK_OnlyOneFKAllowed 
CHECK ( 
    (ProductID is not null AND NewsID is     null and CustomerID is     null) OR 
    (ProductID is     null AND NewsID is not null and CustomerID is     null) OR 
    (ProductID is     null AND NewsID is     null and CustomerID is not null) 
)

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

CREATE TABLE Product (
    ProductID    int identity(1,1) not null,
    CreateUTC    datetime2(7) not null,
     Name        varchar(100) not null
    AlertID     int null,
    CONSTRAINT   PK_Product Primary Key CLUSTERED (ProductID)
)
CREATE TABLE Customer (
    CustomerID  int identity(1,1) not null,
    CreateUTC   datetime2(7) not null,
     Name       varchar(100) not null
    AlertID     int null,
    CONSTRAINT  PK_Customer Primary Key CLUSTERED (CustomerID)
)
CREATE TABLE News (
    NewsID      int identity(1,1) not null,
    CreateUTC   datetime2(7) not null,
    Name        varchar(100) not null
    AlertID     int null,
    CONSTRAINT  PK_News Primary Key CLUSTERED (NewsID)
)

CREATE TABLE Alert (
    AlertID     int identity(1,1) not null,
    CreateUTC   datetime2(7) not null,
    CONSTRAINT  PK_Alert Primary Key CLUSTERED (AlertID)
)

এটি কি একটি সম্পর্কের ডাটাবেসে কেবল জীবন? আপনি কি আরও সন্তুষ্টিজনক বিকল্প বিকল্প আছে?


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

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

1
@ ইবার: "আমাকে যদি ব্যবহারকারীদের মাতৃভাষায় 'নাম' সরবরাহ করতে হয় তবে আমি এটিকে সতর্কতানে সংরক্ষণ করতে পারি না That এটি কোনও অর্থবোধ করে?" না, তা হয় না। আপনার বর্তমান স্কিমা সহ, যদি আপনাকে ব্যবহারকারীদের স্থানীয় ভাষায় 'নাম' সরবরাহ করতে হয়, আপনি কি এটি পণ্য, গ্রাহক বা নিউজ সারণীতে সংরক্ষণ করতে পারবেন?
ypercubeᵀᴹ

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

ইতিমধ্যে এটির কোনও স্বীকৃত নাম না থাকলে, আপনি সমস্ত সতর্কতা এবং তাদের সম্পর্কিত বাবা-মাকে দেখতে যে কোয়েরিটি করতে চান তার জন্য আমি "অক্টোপাস যোগ" শব্দটির প্রস্তাব দিই। :)
নাথান লং

উত্তর:


4

আমি দ্বিতীয় সমাধানটি প্রযোজ্য নয় হিসাবে এটি বুঝতে পারি কারণ এটি একটি (অবজেক্ট) থেকে অনেকের (সতর্কতা) সম্পর্ক সরবরাহ করে না।

কঠোর 3NF সম্মতিতে আপনি কেবল দুটি সমাধানে আটকে আছেন।

আমি একটি কম সংশ্লেষ স্কিমা ডিজাইন করব:

CREATE TABLE Product  (ProductID  int identity(1,1) not null, ...)
CREATE TABLE Customer (CustomerID int identity(1,1) not null, ...)
CREATE TABLE News     (NewsID     int identity(1,1) not null, ...)

CREATE TABLE Alert (
  -- See (1)
  -- AlertID     int identity(1,1) not null,

  AlertClass char(1) not null, -- 'P' - Product, 'C' - Customer, 'N' - News
  ForeignKey int not null,
  CreateUTC  datetime2(7) not null,

  -- See (2)
  CONSTRAINT  PK_Alert Primary Key CLUSTERED (AlertClass, ForeignKey)
)

-- (1) you don't need to specify an ID 'just because'. If it's meaningless, just don't.
-- (2) I do believe in composite keys

বা, যদি অখণ্ডতার সম্পর্ক বাধ্যতামূলক হয় তবে আমি ডিজাইন করতে পারি:

CREATE TABLE Product  (ProductID  int identity(1,1) not null, ...)
CREATE TABLE Customer (CustomerID int identity(1,1) not null, ...)
CREATE TABLE News     (NewsID     int identity(1,1) not null, ...)

CREATE TABLE Alert (
  AlertID     int identity(1,1) not null,
  AlertClass char(1) not null, /* 'P' - Product, 'C' - Customer, 'N' - News */
  CreateUTC  datetime2(7) not null,
  CONSTRAINT  PK_Alert Primary Key CLUSTERED (AlertID)
)

CREATE TABLE AlertProduct  (AlertID..., ProductID...,  CONSTRAINT FK_AlertProduct_X_Product(ProductID)    REFERENCES Product)
CREATE TABLE AlertCustomer (AlertID..., CustomerID..., CONSTRAINT FK_AlertCustomer_X_Customer(CustomerID) REFERENCES Customer)
CREATE TABLE AlertNews     (AlertID..., NewsID...,     CONSTRAINT FK_AlertNews_X_News(NewsID)             REFERENCES News)

যাই হোক ...

তিনটি বৈধ সমাধান প্লাস অন্য (অনেকগুলি (অবজেক্টস) - এক-এক (সতর্কতা) সম্পর্কের জন্য বিবেচনা করা ...

এগুলি উপস্থাপিত, নৈতিকতা কী?

এগুলি সূক্ষ্মভাবে পৃথক হয় এবং মাপদণ্ডে ওজন একই হয়:

  • সন্নিবেশ এবং আপডেটে পারফরম্যান্স
  • অনুসন্ধানে জটিলতা
  • স্টোরেজ স্পেস

সুতরাং, আপনি যে কমফায়ার চয়ন করুন।


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

এটি পর্যালোচনা করে, আমি আমার সমাধানের সঠিকতার বিষয়ে সন্দেহ করতে শুরু করি ... যাইহোক, এটি দুবার ভোট দেওয়া হয়েছে, যা আমি ধন্যবাদ জানাই। যদিও আমি বিশ্বাস করি যে আমার নকশাটি বৈধ তবে প্রদত্ত সমস্যার জন্য উপযুক্ত নয়, কারণ 'এন' ইউনিয়নগুলি / যোগদানগুলিকে সম্বোধন করা হচ্ছে না ...
মার্কাস ভিনিসিয়াস পম্পেইউ

ডিআরআই সংক্ষিপ্ত বিবরণ আমাকে পেয়েছে। আপনার সকলের জন্য, এটি ডিক্লারেটিভ রেফারেনশিয়াল ইন্টিগ্রিটির জন্য দাঁড়িয়েছে, রেফারেন্টাল ডেটা অখণ্ডতার পিছনে কৌশল যা সাধারণত ... (ড্রাম রোল) হিসাবে প্রয়োগ করা হয় ... ডিডিএল বিদেশী কী বিবৃতিগুলি। আরো en.wikipedia.org/wiki/Declarative_Referential_Integrity এবং msdn.microsoft.com/en-us/library/...
মার্কাস Vinicius Pompeu

1

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

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