Фон
Я разрабатываю социальное веб-приложение для поэтов и писателей, позволяя им делиться своими стихами, собирать отзывы и общаться с другими поэтами. У меня очень мало формального обучения в области проектирования баз данных, но я читал книги, SO и ресурсы баз данных БД, пытаясь обеспечить производительность и масштабируемость без чрезмерной инженерии.
База данных - это MySQL, а приложение написано на PHP. Я еще не уверен, будем ли мы использовать библиотеку ORM или писать SQL-запросы с нуля в приложении. Помимо веб-приложения, сервер поиска Solr и, возможно, клиент обмена сообщениями будут взаимодействовать с базой данных.
Текущие потребности
Схема, представленная ниже, представляет основные компоненты первой версии веб-сайта. Первоначально пользователи могут зарегистрироваться для сайта и выполнить одно из следующих действий:
- Создание и изменение параметров профиля и настроек учетной записи
- Опубликовать, пометить и классифицировать свою запись
- Читать, комментировать и "любимые" сообщения других пользователей.
- "Следуйте" другим пользователям, чтобы получать уведомления о своей деятельности.
- Поиск и просмотр содержимого и получение рекомендуемых сообщений/пользователей (хотя мы будем использовать поисковый сервер Solr для индексирования данных БД и запуска этих запросов)
Схема
Вот что я придумал в MySQL Workbench для исходного сайта. Я все еще немного расплывчатый в некоторых реляционных вещах базы данных, так что делайте это легко.
Вопросы
- В общем, есть ли что-то, что я делаю неправильно или могу улучшить?
- Есть ли причина, по которой я не должен комбинировать таблицу ExternalAccounts в таблице UserProfiles?
- Есть ли причина, почему я не должен комбинировать таблицу PostStats в таблице Posts?
- Должен ли я расширить дизайн, включив функции, которые мы делаем во второй версии, только для того, чтобы гарантировать, что исходная схема может его поддерживать?
- Есть ли что-нибудь, что я могу сделать, чтобы оптимизировать дизайн БД для индексации/производительности Solr/независимо?
- Должен ли я использовать более естественные первичные ключи, такие как Username вместо UserID, или код zip/area вместо суррогатного LocationID в таблице Locations?
Спасибо за помощь!