Вы должны стремиться иметь первичный ключ в любой нетривиальной таблице, где вы, вероятно, захотите получить доступ (или обновить или удалить) отдельные записи по этому ключу. Первичные ключи могут состоять из нескольких столбцов и, формально говоря, будут самым коротким из доступных суперключей; это самая короткая из доступных групп столбцов, которые вместе однозначно идентифицируют любую строку.
Я не знаю, как выглядит схема базы данных Stack Overflow (и из некоторых вещей, которые я прочитал в блоге Джеффа, я не хочу), но в описанной вами ситуации это вполне возможно. является первичным ключом идентификатора записи, номера редакции и значения тега; конечно, это был бы самый короткий (и единственный) доступный суперключ.
Что касается вашего второго пункта, то, хотя может быть разумно спорить в пользу агрегирования значений в архивных таблицах, это противоречит принципу, что каждое пересечение строк / столбцов в таблице должно содержать одно единственное значение. Хотя это может немного упростить разработку, нет никаких причин, по которым вы не можете использовать нормализованную таблицу с версионными метаданными, даже для чего-то столь же тривиального, как теги.