Saya punya meja yang mewakili film. Bidang adalah:
id (PK), title, genre, runtime, released_in, tags, origin, downloads
.
Basis data saya tidak dapat dicemari oleh baris yang digandakan, jadi saya ingin menegakkan keunikan. Masalahnya adalah bahwa film yang berbeda dapat memiliki judul yang sama, atau bahkan bidang yang sama kecuali tags
dan downloads
. Bagaimana cara menegakkan keunikan?
Saya memikirkan dua cara:
- buat semua bidang kecuali
downloads
kunci utama. Saya menahandownloads
karena JSON dan mungkin akan berdampak pada kinerja. - simpan hanya
id
sebagai kunci utama, tetapi tambahkan batasan unik dengan semua kolom lainnya (kecuali, sekali lagi,downloads
).
Saya membaca pertanyaan ini yang sangat mirip, tetapi saya tidak begitu mengerti apa yang harus saya lakukan. Saat ini tabel ini tidak terkait dengan tabel lain, tetapi di masa depan bisa jadi.
Saat ini saya memiliki kurang dari 20.000 catatan, tetapi saya berharap jumlahnya akan bertambah. Saya tidak tahu apakah ini agak relevan dengan masalah ini.
EDIT: Saya memodifikasi skema dan di sini adalah bagaimana saya akan membuat tabel:
CREATE TABLE movies (
id serial PRIMARY KEY,
title text NOT NULL,
runtime smallint NOT NULL CHECK (runtime >= 0),
released_in smallint NOT NULL CHECK (released_in > 0),
genres text[] NOT NULL default ARRAY[]::text[],
tags text[] NOT NULL default ARRAY[]::text[],
origin text[] NOT NULL default ARRAY[]::text[],
downloads json NOT NULL,
inserted_at timestamp NOT NULL default current_timestamp,
CONSTRAINT must_be_unique UNIQUE(title,runtime,released_in,genres,tags,origin)
);
Saya juga menambahkan timestamp
kolom, tapi itu tidak masalah karena saya tidak akan menyentuhnya. Jadi itu akan selalu otomatis dan unik.