Tatasusunan berbanding Jadual Ternormal
Bila tatasusunan ialah pilihan yang tepat.
Tatasusunan berbanding Jadual Ternormal ialah pelajaran SQL Academy percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran SQL Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus SQL Academy merangkumi sejumlah 4 pelajaran.
Dua Cara Menyimpan Berbilang Nilai
Apabila satu baris perlu menyimpan beberapa nilai yang berkaitan, PostgreSQL menyediakan dua pendekatan utama: menyimpannya sebagai lajur tatasusunan dalam baris yang sama, atau mencipta jadual anak yang berasingan, dengan setiap nilai mendapat barisnya sendiri.
Memahami masa yang sesuai untuk menggunakan setiap pendekatan ialah kemahiran penting dalam mereka bentuk pangkalan data yang cekap dan mudah diselenggara.
Pendekatan Dinormalisasi
Dalam schema yang dinormalisasi sepenuhnya, setiap cebisan data disimpan dalam barisnya sendiri. Jika seorang pengguna boleh mempunyai beberapa nombor telefon, anda mencipta jadual user_phones dengan kunci asing yang merujuk kembali kepada users.
Ini ialah model hubungan klasik dan menjadi pilihan lalai dalam kebanyakan situasi.
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL
);
CREATE TABLE user_phones (
id SERIAL PRIMARY KEY,
user_id INT REFERENCES users(id),
phone TEXT NOT NULL
);
INSERT INTO users (name) VALUES ('Alice'), ('Bob');
INSERT INTO user_phones (user_id, phone) VALUES
(1, '+1-555-0101'),
(1, '+1-555-0102'),
(2, '+1-555-0200');Pendekatan Tatasusunan
TEXT[] PostgreSQL (atau apa-apa jenis lain yang diikuti oleh []) membolehkan anda menyimpan beberapa nilai secara terus dalam satu lajur. Tiada jadual tambahan diperlukan.
Data nombor telefon yang sama boleh disimpan dalam satu baris yang padat bagi setiap pengguna.
CREATE TABLE users_with_phones (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
phones TEXT[]
);
INSERT INTO users_with_phones (name, phones) VALUES
('Alice', ARRAY['+1-555-0101', '+1-555-0102']),
('Bob', ARRAY['+1-555-0200']);Membuat Pertanyaan pada Tatasusunan Itu Mudah
Mencari dalam lajur tatasusunan adalah mudah dengan operator ANY atau operator @> (mengandungi). Anda boleh mencari semua pengguna yang mempunyai nombor telefon tertentu dengan klausa WHERE yang ringkas.
-- Find users who have a specific phone number
SELECT name
FROM users_with_phones
WHERE '+1-555-0101' = ANY(phones);
-- Or using the array-contains operator
SELECT name
FROM users_with_phones
WHERE phones @> ARRAY['+1-555-0101'];Bila Tatasusunan Lebih Sesuai: Carian Mudah
Tatasusunan ialah pilihan yang baik apabila:
- Senarai nilai dibaca bersama sebagai satu unit (teg, label, kategori)
- Anda tidak perlu mencantumkan berdasarkan elemen individu
- Senarai itu mempunyai batas atas semula jadi dan jarang dikemas kini secara berasingan
Contoh klasik ialah menyimpan teg pada catatan blog. Anda sentiasa mendapatkan semua teg sekali gus dan jarang membuat pertanyaan untuk mencari catatan berdasarkan satu teg dalam cantuman yang kompleks.
CREATE TABLE posts (
id SERIAL PRIMARY KEY,
title TEXT NOT NULL,
tags TEXT[]
);
INSERT INTO posts (title, tags) VALUES
('Intro to SQL', ARRAY['sql', 'beginner', 'database']),
('Advanced Indexes', ARRAY['sql', 'performance', 'indexes']),
('NoSQL Overview', ARRAY['nosql', 'beginner']);
-- Get all posts tagged 'beginner'
SELECT title FROM posts
WHERE 'beginner' = ANY(tags);Bila Jadual Dinormalisasi Lebih Sesuai: Hubungan
Jadual dinormalisasi ialah pilihan yang lebih baik apabila:
- Nilai individu memerlukan atribut sendiri (contohnya, nombor telefon mempunyai jenis: rumah/kerja)
- Anda perlu mencantumkan berdasarkan nilai individu
- Nilai berubah secara berasingan dan kerap
- Anda memerlukan integriti rujukan melalui kunci asing
-- Phone numbers need a 'type' attribute — array can't do this cleanly
CREATE TABLE user_phones (
id SERIAL PRIMARY KEY,
user_id INT REFERENCES users(id),
phone TEXT NOT NULL,
type TEXT CHECK (type IN ('home', 'work', 'mobile'))
);
INSERT INTO user_phones (user_id, phone, type) VALUES
(1, '+1-555-0101', 'home'),
(1, '+1-555-0102', 'work');Perbezaan Pengindeksan
Dengan jadual dinormalisasi, anda boleh menambahkan indeks B-tree standard pada kunci asing atau lajur nilai. Dengan tatasusunan, anda memerlukan indeks GIN (Indeks Terbalik Umum) untuk membolehkan carian pantas dalam tatasusunan.
Indeks GIN berfungsi dengan baik, tetapi lebih besar dan lebih lambat untuk dikemas kini berbanding indeks B-tree.
-- Index for fast array element lookups
CREATE INDEX idx_posts_tags ON posts USING GIN (tags);
-- Now this query uses the index efficiently
EXPLAIN SELECT title FROM posts
WHERE tags @> ARRAY['sql'];Pengagregatan Merentas Baris: Dinormalisasi Lebih Sesuai
Apabila anda perlu mengira, mengumpulkan atau mengagregatkan nilai individu, jadual dinormalisasi jauh lebih semula jadi. Pengagregatan dalam tatasusunan memerlukan unnest(), yang mengembangkan tatasusunan menjadi baris terlebih dahulu — pada asasnya mencipta semula struktur dinormalisasi semasa pertanyaan dijalankan.
-- Count posts per tag (array approach — needs unnest)
SELECT tag, COUNT(*) AS post_count
FROM posts, unnest(tags) AS tag
GROUP BY tag
ORDER BY post_count DESC;
-- With a normalized post_tags table this would be simpler:
-- SELECT tag, COUNT(*) FROM post_tags GROUP BY tag;Mengubah Suai Elemen Tatasusunan
Mengemas kini atau memadamkan satu elemen dalam tatasusunan memerlukan sintaks yang kurang kemas — anda mesti menggantikan keseluruhan tatasusunan atau menggunakan array_remove(). Dalam jadual dinormalisasi, anda hanya perlu DELETE atau UPDATE baris tertentu.
-- Remove a single tag from an array column
UPDATE posts
SET tags = array_remove(tags, 'beginner')
WHERE id = 1;
-- Append a new tag
UPDATE posts
SET tags = array_append(tags, 'tutorial')
WHERE id = 1;
SELECT title, tags FROM posts WHERE id = 1;Memastikan Nilai yang Sah
Dalam jadual dinormalisasi, anda boleh menggunakan kunci asing untuk memastikan setiap nilai datang daripada set yang diketahui. Tatasusunan tidak boleh merujuk kepada jadual lain — tatasusunan tidak menyokong kunci asing.
Jika anda memerlukan integriti rujukan yang terjamin bagi setiap elemen, jadual anak ialah satu-satunya pilihan.
-- Normalized: only valid category IDs allowed (FK enforced)
CREATE TABLE categories (
id SERIAL PRIMARY KEY,
name TEXT UNIQUE NOT NULL
);
CREATE TABLE post_categories (
post_id INT REFERENCES posts(id),
category_id INT REFERENCES categories(id),
PRIMARY KEY (post_id, category_id)
);
-- Array: no constraint possible — any text value is accepted
-- UPDATE posts SET tags = ARRAY['totally_invalid_tag'] WHERE id = 1;Panduan Membuat Keputusan Praktikal
Gunakan tatasusunan apabila data itu ialah senarai rata yang ringkas, sentiasa dibaca sebagai satu unit, tiada atribut tambahan bagi setiap elemen, dan integriti rujukan tidak diperlukan (contohnya, teg, label, kata kunci carian).
Gunakan jadual anak dinormalisasi apabila setiap elemen mempunyai atribut sendiri, anda mencantumkan atau mengagregatkan nilai individu, anda memerlukan kunci asing, atau elemen individu kerap dikemas kini atau dipadamkan.
-- Summary example: tags as array (good fit)
SELECT title, tags
FROM posts
WHERE tags @> ARRAY['sql']
ORDER BY title;
-- Unnest when you need row-level processing
SELECT title, unnest(tags) AS tag
FROM posts
ORDER BY title, tag;Semakan Pantas
Senario manakah yang paling sesuai untuk menyimpan data sebagai tatasusunan PostgreSQL berbanding jadual anak dinormalisasi?
Ulang Kaji Pelajaran
Dalam pelajaran ini, anda telah mempelajari pertukaran utama antara tatasusunan dan jadual dinormalisasi dalam PostgreSQL.
- Tatasusunan adalah padat dan mudah digunakan untuk senarai rata yang dibaca sebagai satu unit, seperti teg — tetapi tidak mempunyai kunci asing, menyukarkan kemas kini setiap elemen, dan memerlukan indeks GIN untuk carian pantas.
- Jadual dinormalisasi menyokong atribut setiap elemen, integriti kunci asing, pengagregatan yang cekap dan kemas kini mudah pada peringkat baris — dengan kos cantuman tambahan.
- Pilihan yang tepat bergantung pada cara anda membuat pertanyaan, mengemas kini dan mengaitkan data — bukan sekadar cara anda menyimpannya.
Pelajari SQL dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 46
- Pelajaran
- 183
Soalan Lazim
Adakah pelajaran “Tatasusunan berbanding Jadual Ternormal” percuma?
Ya — teks penuh “Tatasusunan berbanding Jadual Ternormal” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus SQL Academy, tingkat taraf kepada CoddyKit PRO. Kursus SQL Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Tatasusunan berbanding Jadual Ternormal”?
Bila tatasusunan ialah pilihan yang tepat. Anda berlatih SQL Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan SQL Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran SQL Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.
Berapa lamakah pelajaran “Tatasusunan berbanding Jadual Ternormal” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran SQL Academy ini?
Ya. Setiap pelajaran SQL Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Asas Lajur Tatasusunan
- Mencari dalam Tatasusunan
- UNNEST dan Pengagregatan
- Tatasusunan berbanding Jadual Ternormal