স্ব রেফারেন্সিং টেবিল, ভাল না খারাপ? [বন্ধ]


37

কোনও অ্যাপ্লিকেশনের মধ্যে ভৌগলিক অবস্থানের প্রতিনিধিত্ব করে, অন্তর্নিহিত ডেটা মডেলের নকশা দুটি সুস্পষ্ট বিকল্পের (বা আরও বেশি?) প্রস্তাব দেয়।

স্ব-রেফারেন্সিং প্যারেন্ট_আইডি কলাম যুক্ত যুক্ত যুক্ত একটি তালিকা - লন্ডন (লন্ডন প্যারেন্ট আইডি = ইউকে আইডি)

বা দুটি টেবিল, একটি বিদেশী কী ব্যবহার করে একের সাথে অনেকগুলি সম্পর্কের সাথে।

আমার পছন্দটি একটি স্ব-রিফ্র্যাকিং টেবিলের জন্য কারণ এটি সহজেই প্রয়োজনীয় হিসাবে অনেকগুলি উপ অঞ্চলে বিস্তৃত করতে দেয়।

সাধারণভাবে লোকেরা স্ব-রেফারেন্সিং টেবিলগুলি থেকে দূরে থাকে, না এগুলি ঠিক আছে?

উত্তর:


40

স্ব-রেফারেন্সিং টেবিলগুলির সাথে কোনও ভুল নেই।

গভীরভাবে (অনন্ত?) নেস্টেড হায়ারার্কিগুলির জন্য এটি সাধারণ ডাটাবেস ডিজাইনের ধরণ।


@ নিমচিম্পস্কি - পুনরাবৃত্তি ধারণাটির মতো এই ধারণাটিও কারও কারও পক্ষে কঠিন।
ওদেড

2
(কমপক্ষে) স্ব-রেফারেন্সিং টেবিলগুলি মোকাবেলা করার জন্য ওরাকলের এমনকি একটি বিশেষ এসকিউএল চুক্তি রয়েছে, "START দিয়ে উইথ - সংযোগের মাধ্যমে" ধারা B
ব্যবহারকারী 281377

1
@ ব্যবহারকারী 281377 - এবং এসকিউএল সার্ভার hierarchyidপ্রকারটি প্রবর্তন করেছে ।
ওডে

হাইবারনেট ব্যবহার করুন যাতে এটির একটি নিজস্ব সস থাকবে
নিমচিম্পস্কি

4
@ নিমচিম্পস্কি - সেই "প্যারেন্ট_আইডি" কলামের বিকল্প হিসাবে "নেস্টেড সেট মডেল" দেখার বিষয়টি বিবেচনা করুন - এটি একই কার্যকারিতা সরবরাহ করে, তবে শ্রেণিবিন্যাসগুলি উত্তোলনের জন্য আরও ভাল পারফরম্যান্স এবং সহজ কোয়েরি সরবরাহ করে। en.wikipedia.org/wiki/Nested_set_model জো Celko এর বই সিরিজ "এসকিউএল জন্য Smarties" নেস্টেড সেট সংক্রান্ত কিছু মহান নমুনা এসকিউএল হয়েছে।
কিথ পামার জুনিয়র

7

Necromancing।
সঠিক উত্তরটি: এটি কোন ডাটাবেস ইঞ্জিন এবং কোন পরিচালনা সরঞ্জামের উপর নির্ভর করে।

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

কোনও স্ব-রেফারেন্সিং সত্তা / শ্রেণিবিন্যাসের মতো স্ট্যান্ডার্ড পুনরাবৃত্ত সম্পর্কের সবচেয়ে সাধারণ উদাহরণ simple

ফলাফলিত এসকিউএল-সার্ভারের টেবিলটি হ'ল:

IF  EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'dbo.FK_T_FMS_Reports_T_FMS_Reports') AND parent_object_id = OBJECT_ID(N'dbo.T_FMS_Reports'))
ALTER TABLE dbo.T_FMS_Reports DROP CONSTRAINT FK_T_FMS_Reports_T_FMS_Reports
GO

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'dbo.T_FMS_Reports') AND type in (N'U'))
DROP TABLE dbo.T_FMS_Reports 
GO



CREATE TABLE dbo.T_FMS_Reports 
( 
     RE_UID uniqueidentifier NOT NULL 
    ,RE_RE_UID uniqueidentifier NULL 
    ,RE_Text nvarchar(255) NULL 
    ,RE_Link nvarchar(400) NULL 
    ,RE_Sort int NOT NULL 
    ,RE_Status int NOT NULL 
    ,PRIMARY KEY CLUSTERED ( RE_UID ) 
); 

GO

ALTER TABLE dbo.T_FMS_Reports  WITH CHECK ADD  CONSTRAINT FK_T_FMS_Reports_T_FMS_Reports FOREIGN KEY(RE_RE_UID) 
REFERENCES dbo.T_FMS_Reports (RE_UID) 
-- ON DELETE CASCADE -- here, MS-SQL has a problem 
GO

ALTER TABLE dbo.T_FMS_Reports CHECK CONSTRAINT FK_T_FMS_Reports_T_FMS_Reports 
GO

তবে আপনি একটি সমস্যা পান:
যখন আপনাকে মেনুপয়েন্টের সমস্ত সাবমেনপয়েন্টগুলি মুছতে হবে, আপনি মুছে ফেলুন-ক্যাসকেড সেট করতে পারবেন না , কারণ মাইক্রোসফ্ট এসকিউএল-সার্ভার পুনরাবৃত্ত ক্যাসকেড মুছে ফেলা সমর্থন করে না (অন্যদিকে, পোস্টগ্রেএসকিউএল দেয় [তবে কেবল যদি গ্রাফটি চক্রীয় নয়], যদিও মাইএসকিউএল এই ধরণের টেবিল কাঠামো মোটেই পছন্দ করে না, কারণ এটি পুনরাবৃত্ত সিটিই সমর্থন করে না)।

সুতরাং আপনি এটির সাথে মুছে ফেলা-অখণ্ডতা / কার্যকারিতা ফুটিয়ে তোলেন, আপনার নিজের কোডে বা কোনও সঞ্চিত পদ্ধতিতে (যদি আপনার আরডিবিএমএস সঞ্চিত-পদ্ধতিগুলি সমর্থন করে) এ জাতীয় কার্যকারিতা বাস্তবায়ন বাধ্যতামূলক করে তোলে।

এতে সন্দেহ নেই যে কোনও ধরণের সম্পূর্ণ-স্বয়ংক্রিয় গতিশীল ডেটা আমদানি / রফতানি ঘটবে, কারণ আপনি বিদেশী-মূল সম্পর্কের (স্ব-স্ব-রেফারেন্সিং) অনুযায়ী সমস্ত টেবিলের জন্য কেবল মুছে ফেলার বিবরণী চালাতে পারবেন না, আপনি কোনও সাধারণ নির্বাচনও করতে পারবেন না * এবং একটি স্বেচ্ছামূলক ক্রমে প্রতিটি সারির জন্য একটি সন্নিবেশ তৈরি করুন।

উদাহরণস্বরূপ, আপনি যখন এসএসএমএস ব্যবহার করে একটি INSERT স্ক্রিপ্ট তৈরি করেন, তখন এসএসএমএস বিদেশী কী পাবেন না এবং এটি নির্ভর করে সন্নিবেশ-বিবৃতি তৈরি করে যা নির্ভরতার সাথে প্রবেশের প্রবেশ করিয়ে দেবে, তারপরে নির্ভরতার পিতামাতার সন্নিবেশ করার আগে, যা কোনও ত্রুটি সহ ব্যর্থ হবে , কারণ বিদেশী-কীটি রয়েছে।

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

শয়তান বিবরণে রয়েছে, পুরানো কথাটি যেমন আছে।

এখন, এমন নয় যে আপনি এই জাতীয় সমস্যাগুলি ঘটাতে পারেন না, তবে আপনার সিস্টেমটি জটিল হয়ে উঠলে (উদাহরণস্বরূপ 200+ টেবিল) আমি সত্যিই এটির প্রস্তাব করব না।
এছাড়াও, একটি সাধারণ বাণিজ্যিক সেটিংসে (দিলবার্টের প্রতিকৃতি হিসাবে), আপনাকে ঠিক সেই সময় দেওয়া হবে না।

আরও ভাল পদ্ধতির, যদিও আরও কঠিন, এটি ক্লোজার টেবিল হবে।
এটি মাইএসকিউএল এ কাজ করে যে যুক্ত বোনাস হবে।
একবার আপনি ক্লোজার-কার্যকারিতা একবার প্রয়োগ করলেন, আপনি এটি প্রায় কোনও সময়ে অতিরিক্ত জায়গায় কাজ করবেন।


3
ক্লোজার টেবিলগুলি আমার নজরে আনার বিষয়ে +1 (কমপক্ষে পরিভাষা, ধারণাটি ইতিমধ্যে জানা ছিল)। আগ্রহী যারা হতে পারে তাদের জন্য এখানে এটির একটি ভাল নিবন্ধ। coderwall.com/p/lixing/closure-tables-for-browing-trees-in-sql
আউটফিট সোর্স

1

যদি সম্পর্কটি আসলে শ্রেণিবদ্ধ হয়, এবং কোনও নেটওয়ার্ক সম্পর্ক নয় (উদাহরণস্বরূপ বিলের একটি উপাদান একটি নেটওয়ার্ক সম্পর্ক, একটি শ্রেণিবিন্যাস নয়) তবে এটি একটি ভাল ধারণা।

এটি জিজ্ঞাসা করতে ধীর হতে পারে। জিনিসগুলির গতি বাড়ানোর জন্য, আপনি একটি বন্ধ সারণী ব্যবহার করতে পারেন।

http://karwin.blogspot.ca/2010/03/rendering-trees-with-closure-tables.html

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