मैं एक अलग दृष्टिकोण चुनूंगा। भाग संख्या को बनाए रखने के बजाय, आदेश को जारी रखें भागों में से:
CREATE TABLE book_part (
book_id bigint NOT NULL,
part_order real NOT NULL,
name text NOT NULL,
PRIMARY KEY (book_id, part_order)
);
दर्ज किया जाने वाला पहला भाग part_order
. प्राप्त करता है 0.0 का। यदि आप शुरुआत या अंत में कोई भाग जोड़ते हैं, तो आप बस part_order
. को असाइन करते हैं 1.0 पिछले न्यूनतम या अधिकतम से कम या अधिक। यदि आप दो मौजूदा भागों के बीच एक भाग सम्मिलित करते हैं, तो आप एक part_order
assign असाइन करते हैं यह आसन्न भागों का अंकगणितीय माध्य है।
एक उदाहरण:
-- insert the first part
INSERT INTO book_part VALUES (1, 0.0, 'Introduction');
-- insert a part at the end
INSERT INTO book_part VALUES (1, 1.0, 'Getting started with PostgreSQL');
-- insert a part between the two existing parts
INSERT INTO book_part VALUES (1, 0.5, 'The history of PostgreSQL');
-- adding yet another part between two existing parts
INSERT INTO book_part VALUES (1, 0.25, 'An introductory example');
जब आप तालिका को क्वेरी करते हैं तो वास्तविक भाग संख्या की गणना की जाती है:
SELECT book_id,
row_number() OVER (PARTITION BY book_id ORDER BY part_order) AS part,
name
FROM book_part;
इसकी खूबी यह है कि जब आप किसी भाग को जोड़ते या हटाते हैं तो आपको बहुत सारी पंक्तियों को अपडेट करने की आवश्यकता नहीं होती है।