Вы должны стремиться иметь первичный ключ в любой нетривиальной таблице, где вы, вероятно, хотите получить доступ (или обновление или удаление) отдельных записей по этому ключу. Первичные ключи могут состоять из нескольких столбцов и, формально говоря, будут самым коротким доступным суперключем; то есть кратчайшая доступная группа столбцов, которые вместе идентифицируют каждую строку.
Я не знаю, как выглядит схема базы данных переполнения стека (и из некоторых вещей, которые я читал в блоге Джеффа, я не хочу), но в ситуации, которую вы описываете, это вполне возможно есть первичный ключ по идентификатору сообщения, номеру ревизии и значению тега; конечно, это будет самый короткий (и только) суперкейк.
Что касается вашего второго пункта, хотя разумно спорить в пользу агрегации значений в архивных таблицах, это противоречит принципу, что каждое пересечение строк/столбцов в таблице должно содержать одно единственное значение. Хотя это может немного упростить разработку, нет причин, по которым вы не можете придерживаться нормализованной таблицы с версиями метаданных, даже для того, что тривиально, как теги.
Надеюсь, вы осознали, что последнее предложение было признано непонятным более чем одним человеком. – kch
Возможный дубликат [Если у каждой таблицы есть первичный ключ?] (Https://stackoverflow.com/questions/840162/should-each-and-every-table-have-a-primary-key) –