Không lưu trữ topic_id
trong paper
bàn. Thay vào đó, hãy tạo một bảng chuẩn hóa khác (nhiều thành nhiều) liên kết topic_id
thành paper_id
.
/* Each paper can exist in this table as many times as necessary for all its topics */
CREATE TABLE paper_topics (
paper_id INT NOT NULL,
topic_id INT NOT NULL,
FOREIGN KEY (paper_id) REFERENCES paper (paper_id),
FOREIGN KEY (topic_id) REFERENCES topic (topic_id),
PRIMARY KEY (paper_id, topic_id)
);
Điều này sẽ cho phép bạn lưu trữ nhiều chủ đề trên mỗi tờ giấy nếu cần.
Để lấy các chủ đề cho một bài báo, hãy sử dụng:
SELECT
paper.*,
topic_name
FROM
paper
LEFT JOIN paper_topics ON paper.paper_id = topic.paper_id
LEFT JOIN topic ON topic.topic_id = paper_topic.topic_id
WHERE paper.paper_id = <some paper id value>
Việc cố gắng lưu trữ nhiều giá trị trong một cột không bao giờ là một ý tưởng hay (chẳng hạn như danh sách topic_id
được phân tách bằng dấu phẩy trong paper
bàn). Lý do là để truy vấn nó, bạn phải sử dụng FIND_IN_SET()
điều này làm tăng độ phức tạp của việc thực hiện các phép nối và khiến bạn không thể sử dụng chỉ mục cột khi truy vấn.