В целом, что-то я делаю неправильно или могу улучшить?
В целом, я не вижу больших недостатков в вашей текущей настройке или схеме.
Что мне интересно, так это ваше разделение на 3 пользовательских таблицы.Я понимаю, что вы хотите, чтобы у вас были намерения (разные вещи, связанные с пользователем), но я не знаю, пойду ли я с той же самой вещью.Если вы планируете отображать на сайте только данные из таблицы User
, это нормально, поскольку другая информация не требуется несколько раз на одной странице, но если пользователям необходимо использовать свое настоящее имя и отображать свое настоящее имя (например,John Doe вместо doe55), это замедлит процесс, когда данные станут больше, поскольку вам может потребоваться объединение.Наличие Preferences
отдельно кажется личным выбором.У меня нет аргументов ни за, ни против.
Вашим таблицам «многие ко многим» не потребуется дополнительный PK (например, PostFavoriteID
).Комбинированных первичных значений PostID
и UserID
будет достаточно, поскольку PostFavoriteID
никогда не используется где-либо еще.Это относится ко всем таблицам соединения
Есть ли какая-либо причина, по которой мне не следует объединять таблицу ExternalAccounts в таблицу UserProfiles?
Как и в предыдущем случае.ответьте, я не вижу адванации или недостатка.Я могу поместить оба в одну и ту же таблицу, так как значения NULL
(или, может быть, лучше -1
) меня не будут беспокоить.
Есть ли причина, почему я не долженt объединить таблицу PostStats в таблицу Posts?
Я бы поместил их в ту же таблицу, используя триггер для обработки приращения таблицы ViewCount
.Я расширяю дизайн, чтобы включить функции, которые мы делаем во второй версии, просто чтобы убедиться, что исходная схема может его поддерживать?
Вы используете нормализованную схему, поэтому любые дополнения могут быть сделаны в любое время,
Есть ли что-нибудь, что я могу сделать, чтобы оптимизировать дизайн БД для индексации / производительности Solr, чего угодно?
Не могу сказать, еще не сделал, ноЯ знаю, что Solr очень мощный и гибкий, поэтому я думаю, что у вас все должно быть в порядке.
Должен ли я использовать более естественные первичные ключи, такие как Имя пользователя вместо UserID или код zip / area вместосуррогатное LocationID в таблице Locations?
В SO обсуждается это много потоков.Лично мне больше нравится суррогатный ключ (или другой уникальный числовой ключ, если таковой имеется), поскольку он делает запросы более легкими и быстрыми, так как ищется int.Если вы разрешите изменить имя пользователя / адрес электронной почты / что-нибудь еще, чем ваш-PK-, то требуются значительные обновления.С суррогатным ключом вам не нужно беспокоиться.
Я бы также добавил, чтобы добавить такие вещи, как created_at
, last_accessed
at (лучше всего сделать с помощью триггеров или процедур IMO), чтобы получить некоторую статистикууже доступно.Это может действительно дать вам ценную статистику
Дальнейшие стратегии для увеличения производительности могут быть такими, как memcache, counter cache, многораздельные таблицы, ... Такие вещи могут обсуждаться, когда вы действительно перегружены пользователями, потому что могут бытьвещи / технологии / техники / ... которые очень специфичны для вашей проблемы.