Я разработчик программного обеспечения.Я люблю кодировать, но ненавижу базы данных ... В настоящее время я создаю веб-сайт, на котором пользователю будет разрешено отмечать сущность как понравившийся (как в FB), tag это и комментарий .
Я застрял в дизайне таблиц базы данных для обработки этой функции.Решение тривиально, если мы можем сделать это только для одного типа вещей (например, фотографии).Но мне нужно включить это для 5 разных вещей (на данный момент, но я также предполагаю, что это число может расти по мере роста всего сервиса).
Я нашел несколько подобных вопросов здесь, но ни один из них не имеетудовлетворительный ответ, поэтому я снова задаю этот вопрос.
Вопрос в том, как правильно эффективно и упруго проектировать базу данных, чтобы она могла хранитькомментарии для разных таблиц , лайков для разных таблиц и тегов для них.Какой-то шаблон дизайна в качестве ответа будет лучшим;)
Подробное описание : у меня есть таблица User
с некоторыми пользовательскими данными и еще 3 таблицы: Photo
с фотографиями , Articles
с артикулами , Places
с местами .Я хочу, чтобы любой зарегистрированный пользователь мог:
комментировать любую из этих 3 таблиц
пометить любую из них как понравившуюся
пометить любого из них каким-либо тегом
Я также хочу подсчитать количество лайков для каждого элемента и количество раз, которое данный тег использовался.
1 st подход :
a) Для тегов я создам таблица Tag [TagId, tagName, tagCounter]
, тогда я создам отношения многие ко многим отношения таблицы для: Photo_has_tags
, Place_has_tag
, Article_has_tag
.
b) То же самое для комментариев.
c) Я создам таблицу LikedPhotos [idUser, idPhoto]
, LikedArticles[idUser, idArticle]
, LikedPlace [idUser, idPlace]
.Количество лайков будет рассчитываться по запросам (что, я полагаю, плохо).И ...
Мне действительно не нравится этот дизайн для последней части, он плохо пахнет для меня;)
2 и подход :
Я создам таблицу ElementType [idType, TypeName == some table name]
, которая будет заполнена администратором (мной) с именами таблиц это может быть понравилось , прокомментировано или помечено .Затем я создам таблицы :
a) LikedElement [idLike, idUser, idElementType, idLikedElement]
и то же самое для комментариев и тегов с соответствующими столбцами для каждого.Теперь, когда я хочу сделать понравившуюся фотографию, я вставлю:
typeId = SELECT id FROM ElementType WHERE TypeName == 'Photo'
INSERT (user id, typeId, photoId)
и для мест:
typeId = SELECT id FROM ElementType WHERE TypeName == 'Place'
INSERT (user id, typeId, placeId)
и так далее ... Я думаю, что второй подход лучше, но я также чувствую, что чего-то не хватает в этом дизайне ...
Наконец, мне также интересно, какое лучшее место для хранения счетчика, сколько раз этот элемент понравился.Я могу думать только о двух путях:
- в таблице элементов (
Photo/Article/Place
) - с помощью select count ().
Я надеюсь, что мойОбъяснение проблемы теперь более основательно.