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

Contenuto per utente:due tabelle con colonne omonime o unite?

Un concetto molto utilizzato in situazioni come questa è avere una tabella utenti e una tabella post, collegandole insieme con un identificatore univoco. Questo identificatore può essere qualsiasi cosa, un ID serializzato, un nome utente, un indirizzo e-mail, ecc., purché sia ​​univoco. Il collegamento viene eseguito utilizzando un vincolo di chiave esterna. Non so esattamente come questo si ottiene in MySQL, ma in Postgres è fatto in questo modo:

CREATE TABLE users (
  id serial PRIMARY KEY,
  name text
);

CREATE TABLE posts (
  content text,
  user_id integer REFERENCES users(id) NOT NULL
);

Le tabelle vengono quindi unite utilizzando un join. Questo può essere fatto in diversi modi, ma ecco un cross join dopo l'inserimento di alcuni valori con cui giocare:

@> INSERT INTO users (name) VALUES ('James');
@> INSERT INTO users (name) VALUES ('Jones');
@> INSERT INTO posts (content, user_id) VALUES ('Hello from James.', 1);
@> INSERT INTO posts (content, user_id) VALUES ('Greetings from Jones.', 2);
@> SELECT U.id AS user_id, U.name, P.content \
   FROM users U, posts P \
   WHERE U.id = P.user_id;

 user_id | name  |        content
---------+-------+-----------------------
       1 | James | Hello from James.
       2 | Jones | Greetings from Jones.

YMMV in MySQL, ma penso che le costruzioni di cui sopra funzioneranno immediatamente.

(modifica:Aggiunti INSERT per chiarimenti)