Mysql
 sql >> Database >  >> RDS >> Mysql

Tenere più elementi in una colonna su mysql

Non memorizzare topic_id nel paper tavolo. Invece, crea un'altra tabella normalizzata (molti-a-molti) che collega topic_id a 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)
);

Ciò ti consentirà di archiviare tutti gli argomenti necessari per foglio.

Per recuperare gli argomenti per un paper, usa:

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>

Non è quasi mai una buona idea tentare di memorizzare più valori in una colonna (come un elenco separato da virgole di topic_id nel paper tavolo). Il motivo è che per eseguire query su di esso, è necessario utilizzare FIND_IN_SET() che aumenta la complessità dell'esecuzione dei join e rende impossibile l'utilizzo di un indice di colonna durante l'esecuzione di query.