Я разработчик программного обеспечения. Я люблю кодировать, но ненавижу базы данных ... В настоящее время я создаю веб-сайт, на котором пользователю будет разрешено пометить объект как понравившийся (как в FB), пометить его и комментировать .
Я застрял в дизайне таблиц базы данных для обработки этой функции. Решение тривиально, если мы можем сделать это только для одного типа вещей (например, фотографий). Но мне нужно включить это для 5 разных вещей (на данный момент, но я также предполагаю, что это число может расти по мере роста всей службы).
Я нашел здесь несколько похожих вопросов, но ни на один из них нет удовлетворительного ответа, поэтому я задаю этот вопрос еще раз.
Вопрос в том, как правильно, эффективно и эластично спроектировать базу данных, чтобы она могла хранить комментарии для разных таблиц , лайки для разных таблиц и теги для них. Какой-нибудь шаблон дизайна в качестве ответа будет лучшим;)
Подробное описание : у меня есть таблица User
с некоторыми пользовательскими данными и еще 3 таблицы : Photo
с фотографиями , Articles
со статьями , Places
с местами . Я хочу разрешить любому зарегистрированному пользователю:
прокомментируйте любую из этих 3 таблиц
отметить любой из них как понравившийся
пометьте любой из них каким-нибудь тегом
Я также хочу подсчитать количество лайков для каждого элемента и количество раз, когда использовался этот конкретный тег.
1- й подход :
а) Для тегов , я создать таблицу Tag [TagId, tagName, tagCounter]
, то я буду создавать много-ко-многим отношения таблиц для: Photo_has_tags
, Place_has_tag
, Article_has_tag
.
б) То же самое относится к комментариям.
в) я создам таблицу 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
таблице element ( ) - с помощью select count ().
Я надеюсь, что теперь мое объяснение вопроса более обстоятельно.