Контент для пользователя: две таблицы с одноименными столбцами или объединением? - PullRequest
2 голосов
/ 21 октября 2011

Название в значительной степени говорит само за себя. У меня есть пользователи, публикующие контент, и я хотел бы прикрепить к сообщениям идентификатор пользователя, который находится в таблице пользователей. Должен ли я добавить столбец идентификатора пользователя в таблицу записей, присоединиться ли через язык БД или использовать язык сценариев для опроса каждой таблицы? Если я должен присоединиться, какое объединение я должен сделать?

Пример содержимого будет выглядеть следующим образом: «Тедди-медведи в моем магазине мягче, чем тедди-козы, но тедди-козлы более привлекательны». - Написано Джеймсом Теддиманом в 15:36.

Ответы [ 3 ]

5 голосов
/ 21 октября 2011

Очень часто используемая концепция в подобных ситуациях - наличие таблицы пользователей и таблицы сообщений, связывающих их вместе с уникальным идентификатором. Этот идентификатор может быть любым - сериализованным идентификатором, именем пользователя, почтовым адресом и т. Д. - при условии, что он уникален. Связывание выполняется с использованием ограничения внешнего ключа. Как именно это достигается в MySQL, я не знаю, но в Postgres это делается так:

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

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

Затем таблицы объединяются с помощью объединения. Это можно сделать несколькими способами, но вот перекрестное соединение после вставки некоторых значений для игры:

@> 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 в MySQL, но я думаю, что приведенные выше конструкции будут работать сразу.

(редактировать: добавлены вставки для уточнения)

2 голосов
/ 21 октября 2011

Практически достаточно добавить идентификатор пользователя в таблицу сообщений.Вставьте идентификатор пользователя, который каждый пост.Затем, извлекая информацию, используйте простое соединение, чтобы получить полную информацию.Вы выбираете запрос должен выглядеть как

 select post.content,post.date,users.firstname,user.lastname from post,users where post.userid=users.id
1 голос
/ 21 октября 2011

Нормализация базы данных предполагает, что лучшим методом является "две таблицы со столбцами", связывающие пользовательский контент с пользователем через user_id. Известно, что этот метод позволяет более эффективно управлять как медведями, так и козами в долгосрочной перспективе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...