Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Content-by-User:zwei Tabellen mit gleichnamigen Spalten oder Join?

Ein sehr häufig verwendetes Konzept in einer solchen Situation besteht darin, eine Benutzertabelle und eine Beitragstabelle zu haben, die durch eine eindeutige Kennung miteinander verknüpft werden. Diese Kennung kann alles sein – eine serialisierte ID, ein Benutzername, eine E-Mail-Adresse usw. – solange sie eindeutig ist. Die Verknüpfung erfolgt über eine Fremdschlüsseleinschränkung. Wie genau das in MySQL erreicht wird, weiß ich nicht, aber in Postgres wird es so gemacht:

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

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

Die Tabellen werden dann mit einem Join zusammengeführt. Dies kann auf verschiedene Arten erfolgen, aber hier ist ein Cross Join nach dem Einfügen einiger Werte, mit denen man spielen kann:

@> 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, aber ich denke, die obigen Konstruktionen werden sofort funktionieren.

(Bearbeiten:INSERTs zur Verdeutlichung hinzugefügt)