Rumah > pangkalan data > tutorial mysql > Bagaimana untuk Mencegah Duplikat Undian dalam MySQL Apabila Menyimpan Data Undian Pengguna?

Bagaimana untuk Mencegah Duplikat Undian dalam MySQL Apabila Menyimpan Data Undian Pengguna?

Mary-Kate Olsen
Lepaskan: 2024-10-29 20:18:03
asal
333 orang telah melayarinya

How to Prevent Duplicate Votes in MySQL When Storing User Voting Data?

Menyimpan Array dalam MySQL untuk Pencegahan Pengundian Berbilang

Pernyataan Masalah

Anda berusaha untuk mencipta jadual dalam MySQL untuk menyimpan pelbagai ID pengguna yang telah mengundi pada komen. Dengan berbuat demikian, anda berhasrat untuk menghalang undian berbilang daripada pengguna yang sama pada ulasan yang sama.

Penyelesaian

Pertimbangkan untuk menggunakan jadual yang berasingan, comments_votes, untuk mewujudkan hubungan banyak-ke-banyak antara komen dan jadual pengguna. Skema berikut menyediakan asas:

CREATE TABLE comments (
    comment_id int,
    body varchar(100),
    PRIMARY KEY (comment_id)
);

CREATE TABLE users (
    user_id int,
    username varchar(20),
    PRIMARY KEY (user_id)
);

CREATE TABLE comments_votes (
    comment_id int,
    user_id int,
    vote_type int,
    PRIMARY KEY (comment_id, user_id)
);
Salin selepas log masuk

Kunci utama komposit (comment_id, user_id) dalam comments_votes menghalang pengguna daripada mengundi beberapa kali pada ulasan yang sama.

Contoh Penggunaan

Masukkan beberapa data untuk ditunjukkan:

INSERT INTO comments VALUES (1, 'first comment');
INSERT INTO comments VALUES (2, 'second comment');
INSERT INTO comments VALUES (3, 'third comment');

INSERT INTO users VALUES (1, 'user_a');
INSERT INTO users VALUES (2, 'user_b');
INSERT INTO users VALUES (3, 'user_c');
Salin selepas log masuk

Tambah undian untuk pengguna 1:

INSERT INTO comments_votes VALUES (1, 1, 1);
INSERT INTO comments_votes VALUES (2, 1, 1);
Salin selepas log masuk

Percubaan untuk mengundi semula pada ulasan yang telah diundi sebelum ini akan mengakibatkan ralat disebabkan oleh keunikan kekangan kunci utama:

INSERT INTO comments_votes VALUES (1, 1, 1);
ERROR 1062 (23000): Duplicate entry '1-1' for key 'PRIMARY'
Salin selepas log masuk

Pertimbangan Utama Asing (InnoDB Sahaja)

Jika menggunakan enjin storan InnoDB, pertimbangkan untuk menambah kekangan kunci asing untuk memastikan integriti rujukan:

...
CREATE TABLE comments (
    ...
) ENGINE=INNODB;

CREATE TABLE users (
    ...
) ENGINE=INNODB;

CREATE TABLE comments_votes (
    ...
    FOREIGN KEY (comment_id) REFERENCES comments (comment_id),
    FOREIGN KEY (user_id) REFERENCES users (user_id)
) ENGINE=INNODB;
Salin selepas log masuk

Kunci asing ini memastikan komen_votes merujuk hanya ID ulasan dan ID pengguna yang sah.

Kelebihan Pendekatan Ini

Penyelesaian ini memberikan beberapa faedah berbanding menyimpan tatasusunan dalam satu medan pangkalan data:

  • Menguatkuasakan integriti rujukan: Kunci asing menjamin konsistensi data dan mengelakkan perhubungan terputus.
  • Memberikan kefleksibelan: Lajur vote_type membenarkan sambungan pengundian pada masa hadapan ( cth., undian naik/turun).
  • Meningkatkan prestasi: Menggunakan jadual berasingan untuk undian membolehkan pertanyaan dan pengindeksan yang cekap.

Atas ialah kandungan terperinci Bagaimana untuk Mencegah Duplikat Undian dalam MySQL Apabila Menyimpan Data Undian Pengguna?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan