База данных MySQL хранит исторические изменения (например, вики) - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть сайт, где я позволяю пользователям изменять пару страниц, но теперь я бы хотел как-то отслеживать эти изменения и показывать их остальным пользователям. (что-то вроде вики, наверное)

Вот что у меня сейчас есть:

id, title, description, country, language, last_update (and ~20+ more fields)

Я думал о создании основной таблицы с идентификатором и последним history_ID, а затем таблица истории получит все вышеперечисленное, поэтому каждая новая запись получит новый history_ID и все новые записи.

Я чувствую, что могу сделать это лучше. Потому что с помощью описанного выше метода я получу массу похожих строк (просто изменив одно поле, букву или что-то в этом роде).

Есть предложения? Спасибо!

1 Ответ

0 голосов
/ 27 апреля 2018

Я думаю, у вас правильная идея. Вам нужны две таблицы, и они должны выглядеть примерно так:

create table page (
  id bigint primary key not null,
  title varchar(100) not null,
  -- More columns here.
  -- The last version of the content column can added here as redundancy,
  --   for performance reasons.
  last_version_id bigint, -- allows null
);

create table page_version (
  id bigint primary key not null,
  content mediumtext not null,
  page_id bigint not null,
  constraint fk_pv_page foreign key (page_id)
    references page (id)
);

alter table page add 
  constraint fk_page_version foreign key (last_version_id)
    references page_version (id);

Последняя версия столбца содержимого может быть добавлена ​​в таблицу page (будет избыточной) для повышения производительности при чтении / отображении страниц.

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

Обратите внимание, что столбец last_version_id допускает нулевые значения, поэтому вы можете фактически вставить / обновить строку в MySQL (в которой не реализована отсрочка проверки ограничений).

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